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