我正在查看 Microsoft 的代码,并注意到以下内容:
可选参数std::vector<T>* vOut
被传递到函数中。该函数本身使用单独的局部变量std::vector<T> result
来表示可选结果。
在函数结束时,它们执行以下操作将结果传递给调用者:
if(vOut) {
std::swap(*vOut,result);
}
为什么有人会std::swap
在这里使用 a 而不是像这样的移动分配
*vOut = std::move(result)
?
6
1 个回答
1
好吧,总有可能某些东西是在 C++11 之前制作的,因此移动可能不可用。
swap
然而,当我希望另一个对象处于“更好定义”的状态时,我可能偶尔会使用——也就是说,移动数据但也有一个清晰的对象,而不仅仅是一个可以安全使用的对象。
最后但并非最不重要的一点是,有人可能不会考虑每一个微小的细节——并不是每一段生产代码都可以作为教科书的示例,而在许多情况下, std::move
vs.std::swap
充其量只是微优化(此举甚至可能是在成员之上实现swap
),所以这不是特别关心的事情。
2
-
即使代码不是在 C++11 之前编写的,很多程序员也会养成
std::swap
在这种情况下使用的习惯,并且由于这没有什么区别,他们可能不会费心去改变他们的习惯。
– -
@JamesKanze 是的,这就是我试图用第三个选项来涵盖的内容:-)
–
|
vOut->swap(result)
–
–
std::move
实际上会发出所有权转移的信号,不是吗?–
std::move
当时不可用/不支持。–
std::swap
表示所有权交换,并且不存在潜在的移动后使用问题std::move
。 (在这种情况下,移动后使用并不是问题。在这种情况下,性能也不是问题。)–
|