04月18, 2019

C++中的Argument-dependent lookup

写代码的时候发现一个问题,有的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没系统学完实在可惜。

本文链接:https://debug.fanzheng.org/post/argument-dependent-lookup-in-cpp.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。