[英]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{} {}
這種解決方法並不困難,但任何想法誰是錯的誰是對的,只是這樣我知道我在做什么,為什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.