STL类使用左值引用将swap()方法定义为void swap(A&)。例如,参见std::vector::swap或此问题“Is `std::move` necessary here?”。

这样的定义意味着我们不能与r值交换,因为r值不会绑定(bind)到。但是,我认为在与r值交换时没有害处。建造它,从那里偷东西,在里面放一些胆量,摧毁它。做完了我们可以添加另一个重载void swap(A&&)来实现它。

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

v.swap(rvalue);

最好写
v = rvalue;

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

最佳答案

最初的搬家文件之一实际上是为容器指定的:

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()减少内存的方法,我并不认为这很重要,因为这是与rvalue交换的主要用例。

07-24 12:42