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_ptr
和function
:
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交换的主要用例。