为什么标准库类不为右值重载 swap() ?

Mik*_*ail 5 c++ swap std move-semantics c++11

STL 类将swap()方法定义为void swap(A&),采用左值引用。例如,请参阅std::vector::swap,或问题是否有必要在交换两个对象时使用 std::move ?

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

我认为我们没有开箱即用的过载的原因只有一个。因为而不是写

v.swap(rvalue);
Run Code Online (Sandbox Code Playgroud)

最好写成

v = rvalue;
Run Code Online (Sandbox Code Playgroud)

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

How*_*ant 4

原始的移动文件之一实际上为容器指定了这一点:

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

后来传播到shared_ptrfunction

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

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

LWG 884 不喜欢用右值参数进行交换:

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

N2844 随后删除了所有右值交换:

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

我不确定这是一个好的举动。然而,对于减少内存的更现代的shrink_to_fit()方法,我并不认为它很重要,因为这是与右值交换的主要用例。