Rus*_*lan 12 c++ arrays g++ c++11
请考虑以下声明:
#include <array>
struct X
{
//std::array<bool,3> arr={false,false,false};
bool brr[3]={false,false,false};
};
Run Code Online (Sandbox Code Playgroud)
按原样,它通常由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>’
Run Code Online (Sandbox Code Playgroud)
OTOH,这个声明里面没有问题main().此外,以下初始化在内部工作struct X:
std::array<bool,3> arr={{false,false,false}};
Run Code Online (Sandbox Code Playgroud)
为什么我不能在结构定义中使用单括号的简单初始化?
Sha*_*our 23
这看起来像一个gcc bug看到:Bug 65815 - brace elision在NSDMI中不起作用.报告说:
在"The C++ Programming Language"的第975页,第4版,Bjarne Stroustrup说:
"数组可以由初始化列表初始化:数组a1 = {1,2,3};"
和Clang(V 3.5)接受它.但是,G ++ 4.9.2认为这是一个错误:
Run Code Online (Sandbox Code Playgroud)"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 };
};
Run Code Online (Sandbox Code Playgroud)
看起来修复是在头版本中,OPs代码在该版本中工作,看到它是实时的.
如错误报告中所述,使用内部括号可能是一种解决方法:
std::array<bool,3> arr={ {false,false,false} };
^ ^
Run Code Online (Sandbox Code Playgroud)