【问题标题】:g++ 4.9 rejects valid aggregate initialization in C++14g++ 4.9 拒绝 C++14 中的有效聚合初始化
【发布时间】:2015-03-22 17:15:33
【问题描述】:

考虑这段代码:

struct S
{
    int x;
    double y = 1.1;
};

int main()
{
    S s = {0};
}

根据 C++14 标准,§ 8.5.1/7

如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从其大括号或相等初始化器中初始化,或者,如果没有大括号或相等- 初始化器,来自一个空的初始化器列表 (8.5.4)。

代码应该完全有效。

但是,g++ 4.9.2 拒绝代码(用-std=c++14编译)

so.cpp:9:13: error: could not convert '{0}' from '<brace-enclosed initializer list>' to 'S'
     S s = {0};

clang++ 另一方面编译它。

这是 g++ 的已知问题吗?

【问题讨论】:

  • gcc 5.0 works ... 可能是一个现已修复的错误
  • @ShafikYaghmour 谢谢!
  • S 在 C++14 之前不是聚合(在 C++11 中,聚合不能有 NSDMI)。如果您查看GCC C++14 feature table,您会发现此功能直到 GCC 5 才实现。
  • @T.C.感谢您的链接,之前应该检查过...

标签: c++ g++ c++14


【解决方案1】:

你是对的,这是有效的 C++14;但是,在 C++11 中,一个带有 in class member initializers was not an aggregate 的类,因此这在 C++11 中无效。

我在回答上述问题时指出的问题是gcc did not support this change until 5.0 (see it live):

G++ 现在支持具有非静态数据成员的 C++14 聚合 初始化器。

struct A { int i, j = i; };
A a = { 42 }; // a.j is also 42

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多