我很难弄清楚为什么这段代码似乎有效。我不应该得到“数组初始化器必须是初始化列表”错误吗?
#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)
答案 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)
作为初始化程序,并且目标类型是数组,因此唯一适用的项目是我突出显示的项目。该计划格式不正确。