使用统一初始化语法使用初始值设定项列表进行类内成员初始化?[复制]
题
我正在尝试使用 MSVC2013 编译以下内容:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
}
编译器给我以下错误: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
如果我将代码更改为:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{{false, false, false}};
}
程序编译并运行良好。这是编译器的问题还是我不明白语法?根据我的阅读,第一个版本应该可以编译。
解决方案
以下是 N3797 中的负责语法:
// after a member declaration:
braced-or-equal-initializer-list:
= initializer-clause
braced-init-list
braced-init-list:
{ initializer-list ,OPT }
{ }
initializer-list:
initializer-clause
initializer-list, initializer-clause
initializer-clause:
assignment-expression
braced-init-list
所以我会说第一个陈述是正确的,并且确实被最近的一个 gcc
和 clang
.
其他提示
如果需要放置分号
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
};
那么看来这是 MS VC++ 2013 编译器的一个错误。至少代码在 www.ideone.com 上编译成功了。
Structire SomeStruct 是一个聚合,应该使用初始值设定项列表进行初始化。
不隶属于 StackOverflow