这个内联初始化std :: array有什么问题?

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认为这是一个错误:

"error: array must be initialized with a brace-enclosed initializer
   const std::array<double, 3> _ar0val = {1.0, -1.0, 1.0};"
Run Code Online (Sandbox Code Playgroud)

该问题缩小到以下测试用例:

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)