数组初始值设定项必须是未显示的初始值设定项列表错误

时间:2018-01-17 18:27:05

标签: c++

我很难弄清楚为什么这段代码似乎有效。我不应该得到“数组初始化器必须是初始化列表”错误吗?

#include <iostream>

class B {
public:
  B() { std::cout << "B Constructor " << std::endl ; }
  B(const B&) { std::cout << "B Copy Constructor " << std::endl ; }
  ~B() { std::cout << "B Destructor " << std::endl ; }
} ;

class A {
public:
  A() { std::cout << "A Constructor " << std::endl ; }
  A(const A& other) : bs(other.bs)
        { std::cout << "A Copy Constructor " << std::endl ;}
  ~A() { std::cout << "A Destructor " << std::endl ; }
private:
  B bs[12] ;
};


int main() {
    A a ;
    A b(a) ;
    return 0 ;
}

g++ --version的输出为g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)

1 个答案:

答案 0 :(得分:4)

它是不正确的,GCC有一个错误。你指定GCC 4.4.7,所以我将把这个答案建立在C ++ 11上。初始值设定项的含义由[dcl.init]/16确定:

  

初始化器的语义如下。目的地类型是   正在初始化的对象或引用的类型以及源   type是初始化表达式的类型。如果初始化程序是   不是单个(可能带括号的)表达式,源类型是   没有定义。

     
      
  • 初始化程序是(非括号)braced-init-list,对象或引用是列表初始化的([dcl.init.list])。
  •   
  • 如果目标类型是引用类型,请参阅[dcl.init.ref]。
  •   
  • 如果目标类型是一个字符数组,一个char16_t数组,一个char32_t数组或一个wchar_t数组,以及   初始化程序是一个字符串文字,请参见[dcl.init.string]。
  •   
  • 如果初始值设定项为(),则对象将进行值初始化。
  •   
  • 否则,如果目标类型是数组,则程序格式错误。
  •   
  • [......这里继续但不相关......]
  •   

必须检查项目符号,以确定目标类型的初始值设定项的含义。由于您使用(other.bs)作为初始化程序,并且目标类型是数组,因此唯一适用的项目是我突出显示的项目。该计划格式不正确。