c++ 为什么标准库类不重载swap()来获取右值?

evrscar2  于 2023-10-21  发布在  其他
关注(0)|答案(3)|浏览(105)

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;

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

g6baxovj

g6baxovj1#

其中一份原始移动文件实际上为集装箱指定了这一点:
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()减少内存的方法,我不确定这有什么关系,因为这是与右值交换的主要用例。

8hhllhi2

8hhllhi22#

你已经或多或少回答了你自己的问题。
我们需要

v.swap(rvalue);

在C++11之前的黑暗时代。从那时起,我们可以显式地抓住右值来做我们想做的事情。
允许swap接受右值将是一种倒退

xj3cbfub

xj3cbfub3#

“移动”的意义在于,一旦你从源移动出去,你就不关心它的状态了。这与swap完全不同,其中两种状态都是事后定义的。
IOW,A::swap(A&& rhs)同时保证和不保证rhs之后将处于什么状态。

相关问题