为什么没有std::前缀for_each也能工作

why for_each works without std:: prefix

本文关键字:each 工作 前缀 std 为什么 for      更新时间:2023-10-16

我认为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 numbern";
    for_each(v.begin(),v.end(),[](int num) {//no std::for_each
        std::cout<<num<<"t";
    });
 return 0;
 }

将注释转换为答案,其工作原因是ADL(参数依赖查找)。基本上,这意味着在当前命名空间中找不到for_each的合适匹配时,编译器有一个内置规则,该规则说,现在查找其他命名空间-它为此使用的命名空间集是参数的命名空间。一旦它有了一组名称空间,它将搜索它们以找到合适的for_each

问题是std::vector<>::iterator是否存在于std::中。显然,在您的实现中确实如此,这就是为什么在std::中找到适当的for_each。在的情况下,这个迭代器可能不在std::中——所以为了安全起见(正如Alan的评论),总是养成用std::来限定的习惯。

这还可以防止其他人在您的名称空间中引入另一个for_each(为了参数的缘故)的任何情况-这可能会破坏东西(在更糟糕的情况下-默默地接受-但在运行时中断)。