clang 3.4
接受以下代码struct A
{
int a[2] = {1, 2};
};
但是,vc ++ 2014 CTP拒绝它并显示错误消息:
error C2536: 'A::A::a': cannot specify explicit initializer for arrays
哪种编译器正确?
答案 0 :(得分:6)
是的,这是合法的,但VC ++不支持此功能。它是uniform initialization的in-class member initialization。
当然the =
sign is optional,您的代码与以下代码相同:
struct A
{
int a[2] {1, 2};
};
答案 1 :(得分:3)
是的,C ++ 11允许(但新增)。具体来说,在C ++ 03中,类成员的语法是(§9.2):
的构件声明符:的
的声明者pure-specifier opt
声明器常量初始化器 opt
恒定初始化:
的的=常量表达式
这允许的唯一就地初始化器是常量表达式。但是,在C ++ 11中,语法已经改变(仍然是§9.2):
构件声明符:的
声明者virt-specifier-seq opt pure-specifier opt
declarator brace-or-equal-initializer opt
这通常允许使用“大括号或相等的初始化程序”,而不是像C ++ 03中那样限制为常量表达式。
[注意,我在这里省略了一些不相关的语法部分,比如位域规范]。