logo

能编译么?

Last Updated: 2023-02-23

入门。

一个简单的 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