当你有一个带有移动构造函数的派生对象,而基类对象也具有移动语义时,从派生对象移动构造函数中调用基类对象移动构造函数的正确方法是什么?
我首先尝试了最显而易见的方法:
Derived(Derived&& rval) : Base(rval)
{ }
然而,这似乎最终会调用基类对象的拷贝构造函数。然后我尝试在这里明确使用std::move
,像这样:
但是,这似乎最终会调用基类对象的拷贝构造函数。然后我尝试在此处显式使用std::move
,如下所示:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
这个方法起作用了,但我很困惑为什么需要这样做。我以为 std::move
只是返回一个右值引用。但由于在这个例子中 rval
已经是一个右值引用,调用 std::move
应该是多余的。但是如果我不在这里使用 std::move
,它就会调用拷贝构造函数。所以为什么需要调用 std::move
?