为什么for_each在没有std ::前缀的情况下工作

A. *_* K. 12 c++ namespaces c++11

我认为for_each是在标准命名空间中定义的,但是这段代码实际上是使用以下编译器标志编译和运行的.有人可以解释一下原因吗?

  //@filename myprog.cpp 
  //g++-4.5 --std=c++0x myprog.cpp

  #include<iostream>
  #include<algorithm>

  int main()
  {
    std::vector<int> v{1,2,3,4,5};
    std::cout<<"printing the number\n";
    for_each(v.begin(),v.end(),[](int num) {//no std::for_each
        std::cout<<num<<"\t";
    });
 return 0;
 }
Run Code Online (Sandbox Code Playgroud)

Nim*_*Nim 15

将注释转换为答案,其工作原因是ADL(Argument Dependent Lookup).基本上这意味着在未能for_each在当前命名空间中找到合适的匹配项时,编译器有一个内置规则,现在可以查看其他命名空间 - 并且它使用的命名空间集合是命名空间.参数.一旦它有一组命名空间,它将搜索它们以找到合适的命名空间for_each.

仍然存在的问题是,是否std::vector<>::iterator存在std::.很明显,在你的实现中它确实存在,这就是找到适当的for_eachin的原因std::.有可能在那里此迭代器是不是在案件std::-所以是安全的(如在艾伦的评论),总是得到与排位赛的习惯std::.

此外,这可以防止其他人for_each在您的命名空间中引入另一个(为了参数) - 这可能会破坏事物(在更糟糕的情况下 - 默默地接受 - 但在运行时中断).

  • "未能在默认命名空间中找到合适的匹配"?我不认为ADL是这样的.如果"默认命名空间"会隐藏关联的命名空间,那么在命名空间重载时会遇到问题.什么是默认命名空间?你的意思是现在吗? (2认同)