簡體   English   中英

數組默認 - 與列表初始化

[英]array default- vs. list-initialization

我有以下代碼,簡化了類似數組的結構:

template<typename T, size_t N>
struct X
{
    T a[N];

    template<typename... A>
    explicit X(A&&... a) : a{std::forward<A>(a)...} { }  // ERROR (2)
};

int main ()
{
    X<int,3> x;           // OK
    X<X<int,3>,2> y{x,x}; // OK
    X<X<int,3>,2> z;      // ERROR (1)
}

這在clang 3.3和gcc 4.8.1中編譯得很好,兩者都是-std=c++11 我正在嘗試升級gcc,所以我現在嘗試4.9.0。 在這種情況下,第3個例子( ERROR (1) )實例化X的構造函數( ERROR (2) ),此時編譯器報告

error: converting to 'X<int, 3ul>' from initializer list would use explicit
   constructor 'X<T, N>::X(A&&...) [with A = {}; T = int; long unsigned int N = 3ul]

最后一個示例嘗試默認初始化數組z ,因此也包含其包含的數組; 但是,如果我說得對,那么gcc基本上說包含的數組是由{}進行列表初始化的,這是不允許的,因為構造函數是顯式的。

如果我添加以下任一形式的另一個默認構造函數,則錯誤消失了:

explicit X() {}
explicit X() : a() {}

不是

explicit X() : a{} {}

這種解決方法並不困難,但任何想法誰是錯的誰是對的,只是這樣我知道我在做什么,為什么?

這是一個GCC錯誤, PR 60417

PR 54835的舊版更改旨在實現C ++委員會提出的修復核心問題1518的方向。 不幸的是,這個更改打破了一些有效的C ++ 03程序,如PR 60417中的第一個示例所示。修復程序已針對PR 60417提交,但它僅處理某些情況。 具體來說,它不會修復使用顯式構造函數初始化類型數組的情況,如本問題所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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