在页面上如何:编写移动构造函数 Microsoft有一个关于如何编写移动构造函数的示例.它基本上是以下形式:
MyClass::MyClass(MyClass&& lhs)
{
*this = std::move(lhs);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过std::move这里真的很需要,但为什么呢?我认为唯一的举动就是转换为T&&.但是lhs已经是类型了MyClass&&,不是吗?
Pie*_*aud 20
命名的右值引用是左值.未命名的右值引用是右值.这对于理解为什么std :: move调用在以下方面是必要的很重要:
foo&& r = foo(); foo f = std::move(r);
看一下这个答案:https://stackoverflow.com/a/5481588/1394283它解释得非常好.
看看这个功能:
void foo(X&& x)
{
X anotherX = x;
// ...
}
Run Code Online (Sandbox Code Playgroud)
有趣的问题是:X复制构造函数的哪个重载在体内被调用foo?这x是一个声明为右值引用的变量.因此,期望它x本身也应该像rvalue一样绑定,也就是
X(X&& rhs);应该被调用,这是非常合理的.
允许移动sematics默认应用于具有名称的内容,如
X anotherX = x;
// x is still in scope!
Run Code Online (Sandbox Code Playgroud)
因为我们刚刚移动的东西,即我们刚刚窃取的东西,仍然可以在后续的代码行中访问,这将是危险的混乱和容易出错.但是移动语义的全部意义只是在它"无关紧要"的地方应用它,因为我们移动的东西会在移动之后消失并消失.
这就是为什么rvalue引用的设计者选择了一个比这更微妙的解决方案的原因:
声明为右值引用的事物可以是左值或右值.区别标准是:如果它有一个名字,那么它就是一个左值.否则,它是一个右值.
资料来源:http://thbecker.net/articles/rvalue_references/section_05.html
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |