C++11 统一初始化'Excess elements in struct initializer'错误



我对以下编译器错误感到惊讶:

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有一个隐式生成的复制构造函数,我不认为这会是个问题。

有人能解释一下这里发生了什么吗?

S可能有一个隐式生成的复制构造函数,但S也是另一回事。集合。因此,(几乎){}的任何使用都会对其进行聚合初始化。因此,{}的内容应该是聚合成员的值。既然你的聚合是空的。。。繁荣

在模板代码中,由于这些原因,应该避免使用统一的初始化语法。对于未知类型的T,您不能确定{...}会做什么。

相关内容

  • 没有找到相关文章

最新更新