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;
而不是交换我们将触发移动分配,这甚至更有效。我是对的,这个理由有效吗?这是唯一的原因吗?
答案 0 :(得分:4)
其中一篇原始移动文件实际上为容器指定了这一点:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1858.html#23.2%20-%20Sequences
后来传播到function
和shrink_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
会处于什么状态。