为什么STL类不会为rvalues重载swap()?

时间:2016-01-24 18:30:20

标签: c++ c++11 swap

STL类将swap()方法定义为void swap(A&),采用l值引用。例如,请参阅std::vector::swap或此问题" Is `std::move` necessary here?"。

这样的定义意味着我们不能与r值交换,因为r值不会被绑定到但是,我认为交换r值没有坏处。构造它,从中偷取,在其中放置一些内脏,将其摧毁。完成。我们可以添加另一个重载void swap(A&&)来实现它。

我只看到一个原因,即我们没有开箱即用的重载。因为而不是写

v.swap(rvalue);

最好写

v = rvalue;

而不是交换我们将触发移动分配,这甚至更有效。我是对的,这个理由有效吗?这是唯一的原因吗?

3 个答案:

答案 0 :(得分:4)

其中一篇原始移动文件实际上为容器指定了这一点:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1858.html#23.2%20-%20Sequences

后来传播到functionshrink_to_fit()

http://cplusplus.github.io/LWG/lwg-defects.html#743

http://cplusplus.github.io/LWG/lwg-defects.html#770

与rvalue争论的交换失去了对LWG 884的支持:

http://cplusplus.github.io/LWG/lwg-defects.html#884

随后N2844删除了所有 rvalue交换:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html

我不肯定这是一个很好的举措。然而,使用更现代的{{1}}减少内存的方法,我并不重要,因为这是交换rvalues的主要用例。

答案 1 :(得分:2)

您或多或少地回答了自己的问题。

我们需要

  v.swap(rvalue);

在黯淡的黑暗时代导致C ++ 11。从那时起,我们可以明确地抓住rvalues来做我们喜欢的事情。

允许swap采取rvalues将向后退一步

答案 2 :(得分:2)

"移动"一旦你离开源,你就不会关心源的状态。这与swap完全不同,后两种状态都是明确定义的。

IOW,A::swap(A&& rhs)同时确实并且不保证之后状态rhs会处于什么状态。