换句话说,以下代码是否有效?- 它适用于 gcc 4.7,但是,我不确定它是在标准中还是仅依赖于实现。
struct A {
int data[3] = { 1, 2, 3 };
};
struct B {
B(int data[])
...
struct C : public B {
C()
: B(A().data)
...
换句话说,以下代码是否有效?- 它适用于 gcc 4.7,但是,我不确定它是在标准中还是仅依赖于实现。
struct A {
int data[3] = { 1, 2, 3 };
};
struct B {
B(int data[])
...
struct C : public B {
C()
: B(A().data)
...
我认为你的问题具有误导性。
struct A {
int data[3] = { 1, 2, 3 };
};
C++11 的一个新特性,参见 [class.mem]:此语法data
在构造类型对象期间初始化数据成员A
。它与初始化列表无关,它是一种语言功能(使用花括号初始化列表进行列表初始化)。
它相当于:
struct A {
int data[3];
inline A() : data{1,2,3}
{}
};
因此,data
如果您已在堆栈上创建了 的实例,A
则它在堆栈上,如果已在堆上创建实例,则它在堆上。
我猜初始化数据所在的位置(= 1,2,3
)是实现定义的。
正如Michael Crawford指出的那样,调用可能存在问题B(int data[])
(将衰减为B(int* data)
),但这些问题并不一定会使您的程序格式错误(它仍应编译)。
至于传递A().data
给 ctor B
:
A()
创建一个临时对象;它的生命周期在 [class.temporary]/3 中指定
临时对象被销毁作为评估完整表达式(1.9)的最后一步,该完整表达式(词法上)包含它们被创建的点。
在mem-initializer-list中使用它们也不例外;完整的表达式是B::B( A().data )
。由于此完整表达式包含 的 ctor B
,因此仅在执行 ctor 后,由它引入的临时A()
数据成员和数据成员data
才会被销毁B::B
。
B 的初始化列表中的 int data[] 是指向数组开头而不是整个数组的指针。这可能不是你想要的。
但是,如果数据是标准模板库向量,则可以使用复制构造函数将整个向量复制到单个初始化列表项中。