c++ - 何时对引用或唯一指针使用 move 语义?

标签 c++ smart-pointers unique-ptr move-semantics

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

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

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

如果我们知道 obj1 不会在 obj2 之前被销毁,那么我们似乎可以让 obj2 成为对 obj1 的引用 已使用完毕。但除此之外,我们不能只使用 unique_ptr 来代替吗?这样我们就可以为 obj1 创建一个唯一的指针,然后传递该指针,而不是尝试 move 该对象?

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

最佳答案

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

但是, move 语义在表达所有权变更时非常方便。例如,假设 obj1 是某种资源(例如数据库连接、您正在编写的文件等)。现在考虑以下事项:

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

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

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

完成的工作

关于c++ - 何时对引用或唯一指针使用 move 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62885265/

相关文章:

c++ - 正确的(资源处理)零规则在哪里?

c++ - Vulkan SDK 可再发行组件

C++:堆栈的 push() 与 emplace()

c++ - 使用 clang 时需要自己安装所有头文件和库吗?

C++ fatal error C1001 : An internal error has occurred in the compiler

c++ - 如何在结构上使用 std::unique_ptr?

c++ - OpenCL 在调用 clGetPlatformIDs 时返回 -64

c++ - 将 unique_ptr 传递给函数

c++ - 在稍后阶段设置 std::shared_ptr 源

c++ - 在类中定义变量时共享指针中的递归