Torsten T. Will的教科书在C ++ 11上说,自从C ++ 11以后,如果定义了这样的非成员函数,std::swap
将使用ADL找到的非成员swap
,因此图案
using std::swap;
swap (obj1, obj2);
总是可以用简单的
代替std::swap (obj1, obj2);
不幸的是,我在其他任何地方都找不到这样的声明。
真相是什么?
答案 0 :(得分:6)
来自C ++ 14(或更具体地说是N4140):
需要:类型
T
应为MoveConstructible(表20)和MoveAssignable(表22)。 效果:交换存储在两个位置的值。
此处没有任何关于呼叫非会员swap
的内容。所以不,不保证std::swap
是通过非成员swap
实现的。
根据用户定义的非成员ADL std::swap
,甚至不允许实施swap
,这一点并不完全清楚。