gpt4 book ai didi

c++ - 为什么 std::swap 不使用交换习语?

转载 作者:可可西里 更新时间:2023-11-01 17:37:46 25 4
gpt4 key购买 nike

正确使用 std::swap 是:

using std::swap;
swap(a,b);

它有点冗长,但它确保如果 a、b 有更好的交换定义,它就会被选中。

所以现在我的问题是,为什么 std::swap 没有使用这种技术实现,所以用户代码只需要调用 std::swap

所以像这样(忽略 noexcept 和为简洁起见的限制):

namespace std {
namespace internal {
template <class T> // normal swap implementation
void swap(T& a, T& b) { // not intended to be called directly
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
}

template <class T>
void swap(T& a, T& b) {
using internal::swap;
swap(a,b);
}
}

最佳答案

这进入了重言式领域,但它并没有那样做,因为那不是它的目的。

std::swap的目的|是万不得已的交换功能。它应该是您直接调用的东西,除非您真正想要的是使用最后手段交换。

现在,您可以争辩说您建议的是自定义点的更好范例。后见之明总是 20/20;并非 STL 所做的一切都是正确的想法(参见 vector<bool>)。

至于为什么我们不能现在改变它,那是另一回事。 std::swap是万不得已的交换功能。因此,从理论上讲,人们可能正在调用它并期望它绕过任何用户定义的交换代码。因此,以这种方式更改它会破坏他们的代码。

关于c++ - 为什么 std::swap 不使用交换习语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47383287/

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