繁体   English   中英

'结构初始化程序中的多余元素'错误与C ++ 11统一初始化

[英]'Excess elements in struct initializer' error with C++11 uniform initialization

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

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

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

S可能有一个隐式生成的复制构造函数,但S也是其他东西。 聚合 因此,(几乎) {}任何使用都将对其执行聚合初始化。 因此, {}的内容应该是聚合成员的值。 因为你的总量是空的......繁荣。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM