结构A {int a [2] = {1,2}; };合法的C ++ 11?

时间:2014-07-18 03:55:42

标签: c++ visual-c++ c++11 compiler-errors standards

clang 3.4

接受以下代码
struct A
{
    int a[2] = {1, 2};
};

但是,vc ++ 2014 CTP拒绝它并显示错误消息:

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

哪种编译器正确?

2 个答案:

答案 0 :(得分:6)

是的,这是合法的,但VC ++不支持此功能。它是uniform initializationin-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中那样限制为常量表达式。

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