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_each
in的原因std::
.有可能在那里此迭代器是不是在案件std::
-所以是安全的(如在艾伦的评论),总是得到与排位赛的习惯std::
.
此外,这可以防止其他人for_each
在您的命名空间中引入另一个(为了参数) - 这可能会破坏事物(在更糟糕的情况下 - 默默地接受 - 但在运行时中断).
归档时间: |
|
查看次数: |
479 次 |
最近记录: |