10

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

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

有人可以解释这里发生了什么吗?

4

1 回答 1

17

S可能有一个隐式生成的复制构造函数,但S也是别的东西。一个聚合。因此,(几乎)任何使用{}都会对其执行聚合初始化。所以 的内容{}应该是聚合成员的值。而且由于您的聚合是空的...繁荣。

In template code, uniform initialization syntax should be avoided for exactly these reasons. For an unknown type T, you can't be sure exactly what {...} will do.

于 2013-02-20T22:13:40.717 回答