std::ranges::swap() 和 std::swap() 有什么区别?

问题描述 投票:0回答:3

在 C++20 中,有两个

swap
函数模板:
std::ranges::swap(T&&, U&&)
std::swap(T&, T&)

我只是想知道:

他们两个有什么区别?

c++ stl standards c++20 std-ranges
3个回答
8
投票

std::swap
有问题。可能有一个更有效的交换函数不在
std
命名空间中。您应该启用 ADL 来查找并使用它(如果可用),否则使用
std::swap
。这被称为“标准两步”:

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

但是

std::ranges::swap
没有这个问题,并且会调用 ADL 会调用的版本:

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

这里是一个演示。


0
投票

粗略地说:

std::ranges::swap
概括了
std::swap

  • 如果
    T
    U
    相同,则相当于调用
    std::swap
  • 否则它将把参数交换为两个范围 - 如果它们是范围的话。
  • 否则它将执行类似交换的过程,在不同类型 T 和 U 之间进行移动分配。
  • 如果连这都不能发生,它将无法编译。

有关详细信息,请参阅 cpp 参考页面

我必须说,我发现这个函数有点令人困惑和巴洛克式,但是——也许对范围库更有经验的人会产生一种直觉,知道它为什么有意义。


0
投票

其他答案中没有提到的事情-

由于

std::ranges::swap
是一个 niebloid,它代表一个 单个对象,可以分配给变量或传递给函数。

template< typename T>
void do_something( T& a, T& b, auto function )
{
    function( a, b );
}

do_something( v1, v2, std::ranges::swap );
将编译并正常工作。

do_something( v1, v2, std::swap );
无法编译,因为
std::swap
两者是一个模板并且是一个重载模板

© www.soinside.com 2019 - 2024. All rights reserved.