何时在引用或唯一指针上使用移动语义
When to use move semantics over references or unique pointers?
我是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::move
,func1
将不再修改此对象,这有点像一个契约。这可以防止func1
可能覆盖func2
完成的工作
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 移动语义和深层/浅层复制之间有什么关系?
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 复制省略并在返回值中移动语义
- std::元组和移动语义
- 移动语义与返回shared_ptr?
- C++具有移动语义的可变参数工厂会导致运行时崩溃