首页 > 解决方案 > 使用派生的右值引用初始化基

问题描述

在以下代码中:

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 的移动构造函数而不调用 B 的移动构造函数?这里到底发生了什么?

标签: c++classinheritanceconstructormove-semantics

解决方案


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

因为您正在构造A,所以只会A考虑 ' 构造函数。特别是,可以绑定到的临时B返回,然后的移动构造函数用于构造;换句话说,是从临时的.func()A&&AaaB

为什么没有删除移动?

这种情况下不允许复制a省略,必须从临时B.

首先, ifT是一个类类型,并且初始化程序是一个纯右值表达式,其 cv-unqualified 类型与 相同T,初始化程序表达式本身,而不是从它的临时物化,用于初始化目标对象:请参阅复制省略

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


推荐阅读