std::swap 是否保证通过 ADL 找到非会员交换?

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

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

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

总是可以用简单的

代替
std::swap (obj1, obj2);

很遗憾,我在其他地方没有找到这样的说法。

真相是什么?

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

Requires: Type T shall be MoveConstructible (Table 20) and MoveAssignable (Table 22). Effects: Exchanges values stored in two locations.

这里没有关于调用 non-member swap 的内容。所以不,不能保证 std::swap 是通过 non-member swap.

实现的

目前还不完全清楚一个实现是否可以根据 user-defined、non-member ADL swap.

来实现 std::swap