写代码的时候发现一个问题,有的STL函数在没引入std命名空间的时候,不加std::
就能调用。例如:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
std::cout << find(v.begin(), v.end(), 1) - v.begin() << std::endl;
return 0;
}
想了半天也没想明白,然后去Stack Overflow上问了一下,几分钟就有人回答了,说是Argument-dependent lookup。就是说,当找不到一个函数时,就去它的参数的命名空间中继续找。
那为什么要引入这个呢?我们考虑std::cout << "Test\n";
。它其实是operator<<(std::cout, "Test\n");
。实际上,在全局命名空间是没有这种参数的operator<<
的函数的。所以只有引入了Argument-dependent lookup,才能使这种写法可行。
不过,引入Argument-dependent lookup也引入了一些坑,具体可以参考上面的链接。
PS: C++还是太难了,C++ Primer没系统学完实在可惜。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。