std::swap
有问题。可能有一个更有效的交换函数不在 std
命名空间中。您应该启用 ADL 来查找并使用它(如果可用),否则使用 std::swap
。这被称为“标准两步”:
using std::swap;
swap(a, b);
但是
std::ranges::swap
没有这个问题,并且会调用 ADL 会调用的版本:
std::ranges::swap(a, b);
这里是一个演示。
粗略地说:
std::ranges::swap
概括了std::swap
。
T
和U
相同,则相当于调用std::swap
。有关详细信息,请参阅 cpp 参考页面。
我必须说,我发现这个函数有点令人困惑和巴洛克式,但是——也许对范围库更有经验的人会产生一种直觉,知道它为什么有意义。
其他答案中没有提到的事情-
由于
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
是两者是一个模板并且是一个重载模板。