10

我通過以下編譯器錯誤驚訝:'在結構初始化多餘元素' 與誤差C++ 11均勻初始化

template <typename T> 
struct A 
{ 
    A(T t): t_{t} {} 

    T t_; 
}; 

struct S 
{ 
}; 

int main() 
{ 
    A<S> s{S{}}; 
} 

該錯誤是(與鐺):

test.cpp:4:16: error: excess elements in struct initializer 
    A(T t): t_{t} {} 
      ^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here 
    A<S> s{S{}}; 
     ^

GCC給出了類似的錯誤。

我期望表達t_{t}試圖從t複製構造t_。由於S有一個隱式生成的拷貝構造函數,我不希望這是一個問題。

有人可以解釋這裏發生了什麼嗎?

回答

17

S可能有一個隱式生成的拷貝構造函數,但S也是別的。 集合。因此,(幾乎){}的任何使用都將對其執行聚合初始化。因此,{}的內容預計爲彙總成員的值。由於你的總量是空的......繁榮。

在模板代碼中,應該避免使用統一的初始化語法。對於未知類型T,您無法確定{...}將會執行什麼操作。

+0

「正是由於這些原因,應該避免使用統一的初始化語法......」以及其他許多原因,例如修改「S」時改變語義。 – ipc 2013-02-20 22:16:04

+1

@ipc:我不會走得太遠,但事實是,它可能會有時棘手:) – 2013-02-20 22:19:34

+1

不是那麼統一的初始化語法呢? – zahir 2013-02-20 22:21:37