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)
我们将触发移动分配,而不是交换,这甚至更有效。我说的这个理由合理吗?这是唯一的原因吗?
原始的移动文件之一实际上为容器指定了这一点:
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()方法,我并不认为它很重要,因为这是与右值交换的主要用例。
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |