何时在引用或唯一指针上使用移动语义

When to use move semantics over references or unique pointers?

本文关键字:移动 语义 指针 引用 唯一 何时      更新时间:2023-10-16

我是C++的新手,只是在学习移动语义。所以根据我的理解,使用move构造函数我可以做一些类似的事情

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

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

如果我们知道obj1在使用obj2之前不会被破坏,那么我们似乎可以将obj2作为对obj1的引用。但除此之外,我们就不能直接使用unique_ptr吗?这样我们就只为obj1创建一个唯一的指针,然后传递这个指针,而不是试图移动对象?

有没有一些情况我没有考虑?

根据您提供的示例,我同意您可以在这里使用引用,甚至可以使用shared_ptr,但这实际上取决于您的用例。

然而,移动语义在表示所有权变更时非常方便。例如,假设obj1是某种资源(比如数据库连接、您正在编写的文件等(。现在考虑以下内容:

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

在CCD_ 8的第三行中,我们将CCD_ 9的所有权转移到CCD_。在这一行之后,func1不再拥有obj1并且不应该使用它,而func2可以对obj1执行它需要执行的任何操作。

这对于资源尤其有用,比如文件,其中func1可以对文件执行某些操作,然后让func2执行其他操作。通过使用std::movefunc1将不再修改此对象,这有点像一个契约。这可以防止func1可能覆盖func2完成的工作