c++ - 何时在引用或唯一指针上使用移动语义?
问题描述
我是 C++ 新手,刚刚学习移动语义。所以据我了解,使用移动构造函数我可以做类似的事情
MyObj obj1;
MyObj obj2 = std:move(obj1);
我们必须定义自己的移动构造函数来清理 obj1 等。
如果我们知道在使用完成之前不会被销毁,似乎我们可以obj2
作为参考。但除此之外,我们不能只使用 an吗?这样我们只需为 obj1 创建一个唯一指针,然后传递这个指针而不是尝试移动对象?obj1
obj1
obj2
unique_ptr
是否有一些我没有考虑的情况?
解决方案
从您提供的示例中,我同意您可以在此处使用参考,甚至可以使用参考,shared_ptr
但这实际上取决于您的用例。
然而,移动语义在表达所有权的变化时非常方便。例如假设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
推荐阅读
- algorithm - Warshall 算法思想和可能的改进
- python - Python套接字:客户端如何向服务器发送多条消息
- bash - 在 bash 配置文件中定义函数时,意外标记“(”附近出现语法错误
- perl - Perl:在特定字符串之后拆分混合的文本和二进制文件
- c# - services.AddSingleton,服务的构造函数永远不会被调用
- android-toast - 如何在 WorkManager doWork() 中显示吐司
- c# - 这个 BackgroundWorker 声明它不报告进度
- linux - 使用 linux 工具将 \u003c 转换为 < 字符
- java - 如何将选项 1 和 2 中的输入打印到选项 3?这是我的代码
- vue.js - 通过添加调整大小事件监听器来更新 DOM 元素的高度