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

xml*_*lmx 4 c++ standards stl c++20 std-ranges

在C++20中,有两个swap函数模板:std::ranges::swap(T&&, U&&)std::swap(T&, T&)

我只是好奇:

他们两个有什么区别?

Ayx*_*xan 8

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

using std::swap;
swap(a, b);
Run Code Online (Sandbox Code Playgroud)

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

std::ranges::swap(a, b);
Run Code Online (Sandbox Code Playgroud)

是一个演示。

  • @einpoklum 问题是 `std::swap` 经常超载,而我从未见过 `std::sort` 超载。如果你用谷歌搜索“std 2-step”,这是一个非常常见的习惯用法。例如:[类方法实现体内的“using std::swap”是什么意思?](/sf/answers/334796661/)。 (5认同)
  • @xmllmx 是的。您应该在所有新代码中使用“std::ranges::swap”。 (4认同)
  • @einpoklum `swap` 通常对于自定义类来说是重载的,这与标准库的其他部分不同。如果每个人都开始使用范围版本,我们就不必一直教人们在使用“swap”之前始终记住启用 ADL。此外,范围还包括“开始”、“结束”等,以前也需要 ADL 才能处理自定义类型。 (4认同)
  • 我们可以安全地说:“std::swap”应该完全替换为“std::ranges::swap”吗? (2认同)