在派生对象上移动构造函数

Cha*_*l72 45 c++ move-semantics c++11

当你有一个带有移动构造函数的派生对象,并且基础对象也有移动语义时,从派生对象移动构造函数调用基础对象移动构造函数的正确方法是什么?

我首先尝试了最明显的事情:

 Derived(Derived&& rval) : Base(rval)
 { }
Run Code Online (Sandbox Code Playgroud)

但是,这似乎最终调用了Base对象的复制构造函数.然后我尝试std::move在这里明确使用,像这样:

 Derived(Derived&& rval) : Base(std::move(rval))
 { }
Run Code Online (Sandbox Code Playgroud)

这有效,但我很困惑为什么这是必要的.我以为std::move只返回一个右值引用.但是因为在这个例子rval中已经是一个右值引用,所以调用std::move应该是多余的.但如果我不在std::move这里使用,它只是调用复制构造函数.那么为什么要求std::move必要?

Chu*_*dad 40

rval不是Rvalue.它是移动构造函数体内的左值.这就是我们必须明确调用的原因std::move.

请参阅.重要的是

注意上面的参数x被视为移动函数内部的左值,即使它被声明为右值引用参数.这就是为什么在传递给基类时有必要说move(x)而不是x.这是移动语义的一个关键安全功能,旨在防止意外地从某个命名变量移动两次.所有移动仅从rvalues发生,或者使用显式转换为rvalue,例如使用std :: move.如果您有变量的名称,则它是左值.