0

换句话说,以下代码是否有效?- 它适用于 gcc 4.7,但是,我不确定它是在标准中还是仅依赖于实现。

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

struct B {
    B(int data[]) 
    ...

struct C : public B {
    C() 
        : B(A().data) 
    ...
4

2 回答 2

2

我认为你的问题具有误导性。

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

于 2013-05-14T00:38:57.360 回答
1

B 的初始化列表中的 int data[] 是指向数组开头而不是整个数组的指针。这可能不是你想要的。

但是,如果数据是标准模板库向量,则可以使用复制构造函数将整个向量复制到单个初始化列表项中。

于 2013-05-14T00:38:54.670 回答