std :: swap是否可以通过ADL查找非成员交换?

时间:2015-12-29 16:12:05

标签: c++ c++11 swap

Torsten T. Will的教科书在C ++ 11上说,自从C ++ 11以后,如果定义了这样的非成员函数,std::swap将使用ADL找到的非成员swap,因此图案

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

总是可以用简单的

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

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

真相是什么?

1 个答案:

答案 0 :(得分:6)

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

  

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

此处没有任何关于呼叫非会员swap的内容。所以不,不保证std::swap是通过非成员swap实现的。

根据用户定义的非成员ADL std::swap,甚至不允许实施swap,这一点并不完全清楚。