考虑以下声明:
#include <array>
struct X
{
//std::array<bool,3> arr={false,false,false};
bool brr[3]={false,false,false};
};
按原样,它通常由g ++ 5.2编译。但如果我取消注释std::array
,我会收到错误:
test.cpp:5:46: error: array must be initialized with a brace-enclosed initializer
std::array<bool,3> arr={false,false,false};
^
test.cpp:5:46: error: too many initializers for ‘std::array<bool, 3u>’
OTOH,这个声明在main()
内没有问题。此外,以下初始化在struct X
内可以正常工作:
std::array<bool,3> arr={{false,false,false}};
为什么我不能在结构定义中使用单个括号进行简单初始化?
答案 0 :(得分:23)
这看起来像gcc错误,请参阅:Bug 65815 - brace elision doesn't work in NSDMI。报告说:
在“The C ++ Programming Language”的第975页,第4版,Bjarne Stroustrup说:
“数组可以由初始化列表初始化:数组a1 = {1,2,3};“
和Clang(V 3.5)接受了它。但是,G ++ 4.9.2认为这是一个 错误:
"error: array must be initialized with a brace-enclosed initializer const std::array<double, 3> _ar0val = {1.0, -1.0, 1.0};"
问题缩小到以下测试用例:
struct array {
int data [2];
};
struct X {
array a = { 1, 2 };
};
看起来修补程序位于修订版本中,OPs代码适用于该修订版see it live。
如错误报告中所述,使用内部括号可能是一种解决办法:
std::array<bool,3> arr={ {false,false,false} };
^ ^