【问题标题】:Is std::swap guaranteed to find nonmember swap by ADL? [duplicate]std::swap 是否保证通过 ADL 找到非成员交换? [复制]
【发布时间】:2015-12-29 16:12:05
【问题描述】:

Torsten T. Will 关于 C++11 的教科书说,从 C++11 开始,如果定义了这样的非成员函数,std::swap 将使用 ADL 找到的非成员 swap,因此模式

using std::swap;
swap (obj1, obj2);

总是可以用简单的代替

std::swap (obj1, obj2);

很遗憾,我在其他任何地方都没有找到这样的声明。

真相是什么?

【问题讨论】:

  • 我怀疑这是真的,因为如果那个非成员 swap 是通过 std::swap 实现的,那么就会有无限的相互递归。或者更糟的是,swap 函数不交换对象(而是碰巧做了一些完全不相关的事情,恰好被命名为 swap 并接受两个可变引用)。但这只是我的预感;众所周知,我有时是完全错误的。

标签: c++ c++11 swap


【解决方案1】:

来自 C++14(或更具体地说是 N4140):

要求:类型 T 应为 MoveConstructible(表 20)和 MoveAssignable(表 22)。 效果:交换存储在两个位置的值。

这里没有关于调用非会员swap 的内容。所以不,不能保证std::swap 是通过非成员swap 实现的。

不完全清楚是否允许实现以用户定义的非成员 ADL swap 的形式实现 std::swap

【讨论】:

  • 我不确定特定的实现是否可以(合法地)做到这一点。它假定非成员 swap 产生所需的效果(交换两个对象的值)。如果编译器可以看到非成员 swap 实现,并且如果它足够简单,编译器可以推断出它确实交换了对象,那么我想它可以调用它。但我不认为编译器可以对重要的非成员 swap 函数做出任何假设,因为它们是否真的交换了对象并不清楚。
  • 好吧,那教科书就错了。不过总的来说还是很不错的。
  • @Cornstalks:这是一个很好的观点。
猜你喜欢
  • 2012-02-28
  • 2015-03-23
  • 1970-01-01
  • 2012-12-13
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多