问题描述
在 C++20 中,有两个 swap
函数模板:std::ranges::swap(T&&,U&&)
和 std::swap(T&,T&)
。
我只是想知道:
两者有什么区别?
解决方法
std::swap
有问题。可能有一个更高效的交换函数不在 std
命名空间中。如果可用,您应该启用 ADL 以查找和使用它,否则使用 std::swap
。它被称为“标准 2 步”:
using std::swap;
swap(a,b);
但是 std::ranges::swap
没有这个问题并且会调用 ADL 会调用的版本:
std::ranges::swap(a,b);
Here 是一个演示。
,粗略地说:std::ranges::swap
概括了std::swap
。
- 如果
T
和U
相同,则相当于调用std::swap
。 - 否则,它会将参数交换为两个范围 - 如果它们是范围。
- 否则,它将执行类似交换的过程,并在不同类型 T 和 U 之间进行移动分配。
- 如果不能实现,它也将无法编译。
有关详细信息,请参阅 cppreference page。
我必须说我发现这个函数有点令人困惑和巴洛克式的,但是 - 也许对范围库更有经验的人会产生一种直觉,为什么它是有意义的。