我正在查看 Microsoft 的代码,并注意到以下内容:

可选参数std::vector<T>* vOut被传递到函数中。该函数本身使用单独的局部变量std::vector<T> result来表示可选结果。

在函数结束时,它们执行以下操作将结果传递给调用者:

if(vOut) {
    std::swap(*vOut,result);
}

为什么有人会std::swap在这里使用 a 而不是像这样的移动分配
*vOut = std::move(result)

6

  • 作为一个 nit,我实际上会使用成员交换来代替vOut->swap(result)


    – 

  • 看起来其中一个有六个,而另一个则有六个。两者都有什么优点吗?对我来说似乎不是。其中一个应该和另一个一样好。除非您已经分析了实现它的两种方法,并发现一种方法优于另一种方法。


    – 

  • @Eljay 这里没有人谈论性能。然而 astd::move实际上会发出所有权转移的信号,不是吗?


    – 

  • 2
    @Raildex 该提交是 10 年前的,而且代码很可能更旧。因此,很可能std::move当时不可用/不支持。


    – 

  • 3
    Astd::swap表示所有权交换,并且不存在潜在的移动后使用问题std::move。 (在这种情况下,移动后使用并不是问题。在这种情况下,性能也不是问题。)


    – 


1 个回答
1

好吧,总有可能某些东西是在 C++11 之前制作的,因此移动可能不可用。

swap然而,当我希望另一个对象处于“更好定义”的状态时,我可能偶尔会使用——也就是说,移动数据但也有一个清晰的对象,而不仅仅是一个可以安全使用的对象。

最后但并非最不重要的一点是,有人可能不会考虑每一个微小的细节——并不是每一段生产代码都可以作为教科书的示例,而在许多情况下, std::movevs.std::swap充其量只是微优化(此举甚至可能是在成员之上实现swap),所以这不是特别关心的事情。

2

  • 即使代码不是在 C++11 之前编写的,很多程序员也会养成std::swap在这种情况下使用的习惯,并且由于这没有什么区别,他们可能不会费心去改变他们的习惯。


    – 

  • @JamesKanze 是的,这就是我试图用第三个选项来涵盖的内容:-)


    –