我对以下编译器错误感到惊讶:
template <typename T>
struct A
{
A(T t): t_{t} {}
T t_;
};
struct S
{
};
int main()
{
A<S> s{S{}};
}
错误是(与clang):
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
具有隐式生成的复制构造函数,因此我不认为这是一个问题。
有人能解释一下这里发生了什么吗?
答案 0 :(得分:17)
S
可能有一个隐式生成的复制构造函数,但S
也是其他东西。 聚合。因此,(几乎){}
的任何使用都将对其执行聚合初始化。因此,{}
的内容应该是聚合成员的值。因为你的总量是空的......繁荣。
在模板代码中,出于这些原因,应该避免统一初始化语法。对于未知类型T
,您无法确定{...}
将会做什么。