2015-10-02 51 views
11

考慮以下聲明:std :: array的內聯初始化有什麼問題?

#include <array> 

struct X 
{ 
    //std::array<bool,3> arr={false,false,false}; 
    bool brr[3]={false,false,false}; 
}; 

AS是,它由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

注意,在C++ 11相對於C++ 14具有類初始化[使支撐一個非集合](http://stackoverflow.com/q/27118535/1708801)。 –

回答

22

這看起來像一個海灣合作委員會的錯誤見:Bug 65815 - brace elision doesn't work in NSDMI。報告說:

On Page 975 of "The C++ Programming Language", 4th edition, Bjarne Stroustrup says:

"An array can be initialized by an initializer list: array a1 = { 1, 2, 3 };"

and Clang (V 3.5) accepts it. However, G++ 4.9.2 thinks this is an error:

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

它看起來像固定在頭部改版,有機磷農藥的代碼在該修訂,see it live

如使用內部的大括號錯誤報告指出是一種可能的解決方法:

std::array<bool,3> arr={ {false,false,false} }; 
         ^    ^
相關問題