当派生对象具有移动构造函数,并且基础对象也具有移动语义时,从派生对象移动构造函数调用基础对象移动构造函数的正确方法是什么?
我首先尝试了最明显的事情:
Derived(Derived&& rval) : Base(rval)
{ }
然而,这似乎最终调用了 Base 对象的复制构造函数。然后我尝试明确使用std::move
在这里,像这样:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
这有效,但我很困惑为什么有必要。我想std::move
仅仅返回一个右值引用。但由于在这个例子中rval
已经是一个右值引用,调用std::move
应该是多余的。但如果我不使用std::move
在这里,它只是调用复制构造函数。那么为什么要调用std::move
必要的?
rval
不是右值。它是移动构造函数体内的左值。这就是为什么我们必须显式调用std::move
.
Refer this http://www.artima.com/cppsource/rvalue.html。重要的注意事项是
请注意上面的参数 x 是
被视为内部的左值
移动函数,即使它是
声明为右值引用
范围。这就是为什么有必要
说 move(x) 而不是仅仅 x 当
传递到基类。这
是 move 的一个关键安全功能
旨在防止的语义
不小心从某些地方搬了两次
命名变量。所有动作仅发生
来自右值,或使用显式强制转换
右值,例如使用 std::move。如果
你有一个变量的名称,它
是一个左值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)