根据问题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;
}
它编译并执行时没有任何错误。
所以,问题是,我在这里做错了吗?或者是否有任何导致这种行为改变的变化?
答案 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似乎暗示了这种逐字解释。