首页 > 解决方案 > 何时在引用或唯一指针上使用移动语义?

问题描述

我是 C++ 新手,刚刚学习移动语义。所以据我了解,使用移动构造函数我可以做类似的事情

MyObj obj1;
MyObj obj2 = std:move(obj1);

我们必须定义自己的移动构造函数来清理 obj1 等。

如果我们知道在使用完成之前不会被销毁,似乎我们可以obj2作为参考。但除此之外,我们不能只使用 an吗?这样我们只需为 obj1 创建一个唯一指针,然后传递这个指针而不是尝试移动对象?obj1obj1obj2unique_ptr

是否有一些我没有考虑的情况?

标签: c++smart-pointersunique-ptrmove-semantics

解决方案


从您提供的示例中,我同意您可以在此处使用参考,甚至可以使用参考,shared_ptr但这实际上取决于您的用例。

然而,移动语义在表达所有权的变化时非常方便。例如假设obj1是一些资源(想想数据库连接,你正在编写的文件等)。现在考虑以下几点:

int func1() {
   MyObj obj1;
   // do something with obj1
   func2(std::move(obj1));
   // do some other stuff without obj1
   return 0;
}

在第三行中,func1我们将所有权转移obj1func2。在这一行之后,func1不再拥有obj1也不应该使用它,而func2可以做任何它需要做的事情obj1

这对于资源(例如文件)特别有用,func1可以在其中对文件执行某些操作,然后再func2执行其他操作。通过使用std::move它有点像func1不再修改这个对象的合同。这可以防止func1潜在地覆盖由func2


推荐阅读