使用std :: array不再发生初始化程序语法错误

时间:2015-03-27 09:24:13

标签: c++ arrays std

根据问题std::array c++11 initializer syntax error 不允许以这种方式将支撑列表分配给std :: array:

std::array<int, 10> a = {0,1,2,3,4,5,6,7,8,9};
a = {0}; // error: cannot assign to an array from a braced list

但实际上我不能再重现这个错误了。 我的GCC版本是4.8.2。 这是代码:

#include <array>

int main() {

   std::array<int, 10> a;

    a = {1};

    return 0;
}

它编译并执行时没有任何错误。

所以,问题是,我在这里做错了吗?或者是否有任何导致这种行为改变的变化?

1 个答案:

答案 0 :(得分:1)

表达式a = {1};对应于复制列表初始化的情况(10)(参见here)。所以,根据标准应该是正确的。

您遇到的问题可能与从C ++ 11到C ++ 14的以下更改有关:在C ++ 11中,执行聚合初始化时,只有语法时才能省略嵌套初始化列表周围的大括号... = {...}  使用,但不是...{...}。在C ++ 14中,后者也是允许的。有关详细信息,请参阅here。现在,假设C ++ 11,a = {1};应该是否正确?我认为答案取决于你如何解释标准。显然,{1}用于初始化operator=的第二个操作数。以下是两种可能的解释,分别给出肯定答案和否定答案。

肯定答案的解释:语法... = {...}执行copy-list-init而...{...}执行direct-list-init。所以,标准所说的是在copy-list-init中允许使用大括号,而不是在direct-list-init中。 a = {1};执行copy-list-init。所以省略了。

否定答案的解释:只要给标准一个字面解释。 Elision可以看到等号的外观,而不是其他。在a = {1};中,operator=的操作数的初始化是隐含的,没有等号。所以,这不行。声明here似乎暗示了这种逐字解释。