std::ranges::swap() 和 std::swap() 有什么区别?
What's the difference between std::ranges::swap() and std::swap()?
在 C++20 中,有两个 swap
函数模板:std::ranges::swap(T&&, U&&)
and std::swap(T&, T&)
.
我只是想知道:
他们两个有什么区别?
粗略地说:std::ranges::swap
概括了 std::swap
。
- 如果
T
和U
相同,则相当于调用std::swap
.
- 否则它会将参数交换为两个范围 - 如果它们是范围。
- 否则它将执行类似交换的过程,在不同类型 T 和 U 之间进行移动分配。
- 如果连那个都做不到,编译就会失败。
我必须说我发现这个函数有点令人困惑和古怪,但是 - 也许对 range 库更有经验的人会产生一种直觉,为什么它有意义。
std::swap
有问题。 std
命名空间中可能没有更高效的交换函数。您应该启用 ADL 来查找和使用它(如果可用),否则使用 std::swap
。它被称为“std 2-step”:
using std::swap;
swap(a, b);
但是 std::ranges::swap
没有这个问题并且会调用 ADL 会调用的版本:
std::ranges::swap(a, b);
Here是演示
在 C++20 中,有两个 swap
函数模板:std::ranges::swap(T&&, U&&)
and std::swap(T&, T&)
.
我只是想知道:
他们两个有什么区别?
粗略地说:std::ranges::swap
概括了 std::swap
。
- 如果
T
和U
相同,则相当于调用std::swap
. - 否则它会将参数交换为两个范围 - 如果它们是范围。
- 否则它将执行类似交换的过程,在不同类型 T 和 U 之间进行移动分配。
- 如果连那个都做不到,编译就会失败。
我必须说我发现这个函数有点令人困惑和古怪,但是 - 也许对 range 库更有经验的人会产生一种直觉,为什么它有意义。
std::swap
有问题。 std
命名空间中可能没有更高效的交换函数。您应该启用 ADL 来查找和使用它(如果可用),否则使用 std::swap
。它被称为“std 2-step”:
using std::swap;
swap(a, b);
但是 std::ranges::swap
没有这个问题并且会调用 ADL 会调用的版本:
std::ranges::swap(a, b);
Here是演示