STL类将swap()
方法定义为void swap(A&)
,采用l值引用。例如,参见std::vector::swap,或问题Is it necessary to use std::move when swapping two objects?
这样的定义意味着我们不能与r值交换,因为r值不会绑定到然而,我认为与r值交换没有什么坏处。建造它,偷它,放点内脏进去,摧毁它。完成。我们可以添加另一个重载void swap(A&&)
来实现它。
我只看到一个原因,为什么我们没有这个超载开箱即用。因为我没有写
v.swap(rvalue);
最好是写
v = rvalue;
而不是交换,我们将触发移动分配,这更有效。这个理由是正确的吗?这是唯一的原因吗?
3条答案
按热度按时间g6baxovj1#
其中一份原始移动文件实际上为集装箱指定了这一点:
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()
减少内存的方法,我不确定这有什么关系,因为这是与右值交换的主要用例。8hhllhi22#
你已经或多或少回答了你自己的问题。
我们需要
在C++11之前的黑暗时代。从那时起,我们可以显式地抓住右值来做我们想做的事情。
允许
swap
接受右值将是一种倒退xj3cbfub3#
“移动”的意义在于,一旦你从源移动出去,你就不关心它的状态了。这与
swap
完全不同,其中两种状态都是事后定义的。IOW,
A::swap(A&& rhs)
同时保证和不保证rhs
之后将处于什么状态。