std::swap保证通过ADL找到非成员swap

Is std::swap guaranteed to find nonmember swap by ADL?

本文关键字:swap 成员 ADL std      更新时间:2023-10-16

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

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

总是可以用一个简单的代替

std::swap (obj1, obj2);

不幸的是,我在其他任何地方都找不到这样的说法。

真相是什么?

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

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

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

目前还不完全清楚是否允许一个实现根据用户定义的非成员ADL swap来实现std::swap