Is struct A { int a[2] = {1, 2}; }; legal as per C++11?

Is struct A { int a[2] = {1, 2}; }; legal as per C++11?

本文关键字:legal per C++11 as int struct Is      更新时间:2023-10-16

clang 3.4接受以下代码

struct A
{
    int a[2] = {1, 2};
};

然而,vc++ 2014 CTP拒绝它,并给出一个错误消息:

error C2536: 'A::A::a': cannot specify explicit initializer for arrays

哪个编译器是正确的?

是的,这是合法的,但是vc++不支持这个特性。它是类内成员初始化的统一初始化。

当然,=符号是可选的,您的代码与以下代码相同:

struct A
{
    int a[2] {1, 2};
};

是的,c++ 11允许这样做(但这是新的)。具体来说,在c++ 03中,类成员的语法是(§9.2):

<我> member-declarator:

声明符opt
说明符constant-initializer <子>选择

<我> constant-initializer:

= constant-expression

唯一允许的原位初始化式是常量表达式。然而,在c++ 11中,语法发生了变化(仍然是§9.2):

<我> member-declarator:

声明符virt-specifier-seqopt pure-specifieropt
说明符brace-or-equal-initializer <子>选择

这通常允许"大括号或等号初始化式",而不是像c++ 03中要求的那样限制为常量表达式。

[注意,我在这里省略了一些不相关的语法部分,例如位域的规范]。