STL算法函数名称解析

dim*_*mba 17 c++ stl namespaces

我希望在示例中,bellow编译器将无法编译代码,因为它不知道什么是"find()",它在算法头中的std命名空间中定义.

但是,此代码使用gcc 4.1.2在RHEL 5.3上编译.

我错过了什么?

#include <string>    
#include <algorithm>

int main()
{
    std::string s;
    find(s.begin(), s.end(), 'a');  // should not compile
}
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 27

这适用于Argument Dependent Lookup.在参数类型的命名空间中搜索函数模板.在这种情况下,参数是std::string::iterator,因此在命名空间中搜索函数std.

  • 为了详细阐述*为什么*ADL存在,ADL的"主要"理由是运营商自然地工作.给定两个`std :: string`对象`s1`和`s2`,你希望能够将它们与`s1 + s2`连接起来.没有ADL,你必须编写`std :: operator +(s1,s2)`.但事实证明,它也是一种非常有用的机制 (6认同)
  • Aka Koenig查找.dimba:如果你想向自己证明这一点,你可以看到`:: find`在全局命名空间中不会得到匹配,给定`char a [1]`,`find(&a [0],&a [0],'a')`找不到`std :: find()模板.... (2认同)