【问题标题】:'Excess elements in struct initializer' error with C++11 uniform initialization使用 C++11 统一初始化时出现“结构初始化程序中的多余元素”错误
【发布时间】:2013-02-20 22:08:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ c++11 copy-constructor initializer-list uniform-initialization


    【解决方案1】:

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

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

    【讨论】:

    • uniform initialization syntax should be avoided for exactly these reasons ... 以及许多其他原因,例如在修改 S 时更改语义。
    • @ipc:我不会走得太远,但事实是它有时会很棘手:)
    • @zahir:是的。 Some of us would like to fix that,但似乎强烈反对统一初始化的idea,更不用说实际纠正问题并使其统一了。
    • 这也存在一个核心问题。
    • @JohannesSchaub-litb 你知道它是否在 C++14 中解决了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多