gpt4 book ai didi

c++ - 为什么 STL 类不为右值重载 swap()?

转载 作者:太空狗 更新时间:2023-10-29 20:02:49 26 4
gpt4 key购买 nike

STL 类将 swap() 方法定义为 void swap(A&),采用左值引用。参见示例 std::vector::swap ,或这个问题“Is `std::move` necessary here? ”。

这样的定义意味着我们不能与 r 值交换,因为 r 值不会绑定(bind)到 但是,我认为与 r 值交换没有坏处。 build 它,窃取它,在其中放置一些胆量,摧毁它。完毕。我们可以添加另一个重载 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_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

我不认为这是一个好举措。然而,使用更现代的 shr​​ink_to_fit() 减少内存的方法,我不认为它很重要,因为这是与右值交换的主要用例。

关于c++ - 为什么 STL 类不为右值重载 swap()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com