微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决std::ranges::swap() 和 std::swap() 有什么区别?

在 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

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

有关详细信息,请参阅 cppreference page

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。