我是 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/