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

时间:2015-10-02 17:45:29

标签: c++ arrays c++11 g++

考虑以下声明:

#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}};

为什么我不能在结构定义中使用单个括号进行简单初始化?

1 个答案:

答案 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} };
                         ^                 ^