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

时间:2011-07-18 08:20:02

标签: 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;
 }

1 个答案:

答案 0 :(得分:15)

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

仍然存在的问题是std::vector<>::iterator是否位于std::。显然,在您的实施中,这就是找到for_each中相应std::的原因。 可能这个迭代器不在std::的情况 - 所以为了安全(如Alan的评论),总是养成用std::进行排位的习惯。

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