我认为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;
}
答案 0 :(得分:15)
将注释转换为回答,其工作原因是ADL(Argument Dependent Lookup)。基本上这意味着在未能在当前命名空间中找到for_each
的合适匹配时,编译器有一个内置规则,现在看看其他命名空间 - 以及它用于此的命名空间集合是参数的名称空间。一旦它有一组命名空间,它将搜索它们以找到合适的for_each
。
仍然存在的问题是std::vector<>::iterator
是否位于std::
。显然,在您的实施中,这就是找到for_each
中相应std::
的原因。 可能这个迭代器不在std::
的情况 - 所以为了安全(如Alan的评论),总是养成用std::
进行排位的习惯。
此外,这可以防止其他人在您的命名空间中引入另一个for_each
(为了参数) - 这可能会破坏事物(在更糟糕的情况下 - 默默地接受 - 但在运行时中断)。< / p>