2014-02-20 47 views
1

在C++ 11中,是否允許使用花括號語法複製聚合?我有以下代碼:使用花括號進行聚合初始化

struct s 
{ 
    int x; 
}; 
template<class T> 
struct holder 
{ 
    template<class A> 
    holder(A&& x) : t{x} {} 
    T t; 
}; 

下面的每一條語句都有效。

auto s1 = s{1}; 
auto s2(s1); 
auto s3{s1}; ///NOTE : this works! 

但是,下面的第二條語句會產生錯誤cannot convert 's' to 'int' in initialization

holder<s> h{5}; 
holder<s> h1{s{5}}; 

我使用的是gcc 4.8.2。爲什麼我會得到這個錯誤?

+0

此聲明爲 h {5};在www.ideone.com上可以成功編譯 –

回答

2

在C++ 11中,w如果T類型是聚合類型,則使用{ ... }執行聚合初始化。總計初始化總是初始化T的成員,而不是T本身。

雖然這正是標準所要求的,但這是不需要的,這就是爲什麼在未來的標準中,規則可能會改變,以便爲來自同一類型的初始化做出特殊的例外。 This is core language issue 1467.

直到那個時候,不幸的是,你得到的錯誤是完全正確的,你將不得不解決它。

+1

我知道這是一個帶有花括號初始化的聚集問題(在TC++ PL書籍勘誤中也提到過),並且將在C++ 14中進行更正。但是,如代碼所示,'auto s3 {s1};'確實有效,而'持有者 h1 {s {5}};'或者s4 {s1};'不起作用。第一個原因可能是什麼原因? – abir

+2

@abir在'auto s3 {s1};','auto'被推斷爲'std :: initializer_list ',而不是's'。 – hvd

0

首先這個代碼

struct s 
{ 
    int x; 
}; 
template<class T> 
struct holder 
{ 
    template<class A> 
    holder(A&& x) : t{x} {} 
    T t; 
}; 

int main() 
{ 
    holder<s> h{5}; 
    return 0; 
} 

表被成功編譯。

無效的語句是

holder<s> h1{s{5}}; 

的問題是,其實你試圖執行

s s1 = { s{5} }; 

但是編譯器是無法S型的對象轉換爲類型的對象int(初始化s1.x)當它試圖分配時

s.x = s{5};