【发布时间】: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.感谢您的链接,之前应该检查过...