簡體   English   中英

這個 std::array 的內聯初始化有什么問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM