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