能编译么?
入门。
一个简单的 C++程序,
std::string s1 = "hi", s2 = "bye";
swap(s1, s2);
std::cout << s1 << " " << s2 << std::endl;
打印出了bye hi
.
放弃?
换成int
试试?
int a = 3, b = 7;
swap(a, b);
编译报错:
error: use of undeclared identifier 'swap'; did you mean 'std::swap'?
swap(a, b);
^~~~
std::swap
为什么 string 可以,int 就不行?
进阶!
这玩意有个学术名词叫 ADL,Argument Dependent Lookup。说人话就是如果参数是 std
里的,那函数也在 std
里找。在第一个例子中,参数是两个 std::string
,这段代码里没有 swap
被定义,所以就到 std
里找 swap
,结果还真找到了。第二个例子用的是 int
,跟 std
没关系,编译器就不会去 std
里找。不过编译器现在已经足够聪明,猜出来了你其实是想用 std::swap
。
修改方法很简单,加上std::
int a = 3, b = 7;
std::swap(a, b);
std::cout << a << " " << b << std::endl;
参考
Understanding and Mastering C++'s Complexity - Amir Kirsh - CppCon 2021 https://www.youtube.com/watch?v=ECA-7erEJdU