使用导出的右值引用初始化基数

问题描述 投票:3回答:1

在以下代码中:

struct A {
    A() {}
    A(A &&) { printf("moving A\n"); }
    ~A() { printf("destructing A\n"); }
};

struct B : A {
    B() {}
    B(B &&) { printf("moving B\n"); }
    ~B() { printf("destructing B\n"); }
};

B func() {
    B b;
    return b;
}

int main() {
    A a = func();
    printf("hello\n");
}

产生以下输出:

moving A
destructing B
destructing A
hello
destructing A

为什么不放弃这一举动?为什么调用A的move构造函数而不调用B的move构造函数?这里实际上发生了什么?

c++ class inheritance constructor move-semantics
1个回答
2
投票

为什么调用A的move构造函数而不调用B的move构造函数?

由于正在构造A,因此仅考虑A的构造函数。特别是,由B返回的临时func()可以绑定到A&&,然后使用A的move构造函数构造a;换句话说,a是从临时B中切出的。

为什么不放弃这一举动?

在这种情况下不允许使用[Copy elision,必须从临时a构造B

[首先,如果T是类类型,并且初始化程序是cv不合格类型与T属于同一类的prvalue表达式,则使用初始化程序表达式本身而不是从其实例化的临时表达式目标对象:请参见copy elision

[func()返回一个B,它与A的类型完全不同。

© www.soinside.com 2019 - 2024. All rights reserved.