其他分享
首页 > 其他分享> > c – 为什么显式调用base move构造函数实际调用基类复制构造函数?

c – 为什么显式调用base move构造函数实际调用基类复制构造函数?

作者:互联网

参见英文答案 > Move constructor on derived object                                    2个
我试图通过派生类移动ctor显式调用基类移动ctor,但是,惊讶!,实际上调用基类复制ctor而不是基类移动ctor.

我在一个对象上使用std :: move()函数,以确保调用派生的移动ctor!

代码:

class Base
{
public:
    Base(const Base& rhs){ cout << "base copy ctor" << endl; }
    Base(Base&& rhs){ cout << "base move ctor" << endl; }
};

class Derived : public Base
{
public:

    Derived(Derived&& rhs) : Base(rhs) { cout << "derived move ctor"; }
    Derived(const Derived& rhs) : Base(rhs) { cout << "derived copy ctor" << endl; }
};

int main()
{
    Derived a;
    Derived y = std::move(a); // invoke move ctor
    cin.ignore();
    return 0;
}

计划产出:

base copy ctor

derived move ctor

如你所见,基类移动ctor被遗忘了,所以我该怎么称呼呢?

解决方法:

在Derived类的上下文中,参数rhs显然具有名称.因此,它必须是左值,它不能是右值.然而,T&&只与rvalues绑定.如果要调用基类的移动构造函数,则需要使用如下代码:

Derived(Derived&& rhs): Base(std::move(rhs)) { std::cout << "derived move ctor"; }

这将调用Base的移动构造函数并移动rhs的Base部分.由于Base对Derived成员一无所知,因此Base移动构造函数不会移动Derived添加的任何内容.

标签:move-constructor,c
来源: https://codeday.me/bug/20190726/1540333.html