在某些情况下,似乎我可以访问应该在std命名空间中没有using
或std::
限定符的函数。到目前为止,我只看到过algorithm
库中的函数。
在下面的示例中,我希望all_of()
位于std命名空间中,但此代码在VS2013(Microsoft编译器18)中编译时没有错误。
#include <iostream>
#include <string>
#include <algorithm>
int main() {
const std::string text = "hey";
std::cout << all_of(begin(text),end(text),islower);
return 0;
}
将std::cout
更改为cout
而不添加using namespace std
或using std::cout
会生成&#34;未声明的标识符&#34;错误如预期。
这里发生了什么?
答案 0 :(得分:3)
这可能是由Argument-Dependent Lookup引起的。 begin(text)
和end(text)
返回的迭代器可能是在命名空间std
中定义的类(或嵌套在命名空间std
中的类中),这使得命名空间std
与之相关联。查找函数调用的非限定名称会查找关联的命名空间,并在那里找到all_of
。
顺便说一句,这与调用begin(text)
的工作原理完全相同,即使在命名空间begin()
中定义了函数模板std
。 text
是std::basic_string
,因此会搜索std
。