我正在查看 Microsoft 的代码,我注意到以下内容:
可选参数
std::vector<T>* vOut
被传递到函数中。
该函数本身使用单独的本地 std::vector<T> result
作为可选结果。
在函数结束时,他们执行以下操作将结果传递给调用者:
if(vOut) {
std::swap(*vOut,result);
}
为什么有人会在这里使用
std::swap
而不是像这样的移动分配
*vOut = std::move(result)
?
嗯,总是有可能某些东西是在 C++11 之前制作的,因此移动可能不可用。
但是,当我希望另一个对象处于“更好定义”状态时,我可能偶尔会使用
swap
——也就是说,移动数据但也有一个清晰的对象,而不仅仅是一个可以安全使用的对象。
最后但并非最不重要的一点是,有人可能不会考虑每一个微小的细节 - 并非每一段生产代码都可以作为教科书示例,并且
std::move
与 std::swap
在许多情况下是微观优化最好(这一举措甚至可能在 swap
成员之上实施),所以这不是需要特别担心的事情。