#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string str1 = "good", str2 = "luck";
swap(str1,str2); /*Line A*/
int x = 5, y= 3;
swap(x,y); /*Line B*/
}
如果我评论B行代码编译(http://www.ideone.com/hbHwf),而评论A行代码无法编译(http://www.ideone.com/odHka),我得到了以下错误:
error: ‘swap’ was not declared in this scope
为什么我在第一种情况下没有收到任何错误?
答案 0 :(得分:7)
swap(str1, str2)
因Argument dependent lookup
P.S:Pitfalls of ADL
答案 1 :(得分:3)
您没有资格swap
;由于ADL传递std::string
个对象时它有效,但由于int
不在std
命名空间中,您必须完全限定该调用:
std::swap(x, y);
或使用使用声明:
using std::swap;
swap(x, y);
答案 2 :(得分:2)
字符串位于std :: namespace中,因此编译器会在那里查找字符串的swap()。整数不是,所以它没有。你想要:
std::swap(x,y);
答案 3 :(得分:1)
在这两种情况下,您应该使用std::swap()
而不是swap()
。