[英]What's wrong with this inline initialization of std::array?
考慮以下聲明:
#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}};
為什么我不能在結構定義中使用帶單括號的簡單初始化?
這看起來像一個 gcc 錯誤,請參閱:錯誤 65815 - 括號省略在 NSDMI 中不起作用。 報告說:
在“C++ 編程語言”第 4 版的第 975 頁上,Bjarne Stroustrup 說:
“一個數組可以通過一個初始化列表來初始化:array 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 代碼在該修訂版中有效,請實時查看。
如錯誤報告中所述,使用一組內部大括號是一種可能的解決方法:
std::array<bool,3> arr={ {false,false,false} };
^ ^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.