最近,关于ADL的一些问题让我思考。基本上,我很困惑编译器在执行ADL时可以搜索哪些头文件?仅仅是用户代码中包含的文件,还是它可以包含用户代码中使用相同名称空间的其他头文件?例如。 std
名称空间跨多个头文件。但是,我可能只包括其中的一部分。现在,如果我定义的函数不在头文件的此子集中,但在std
命名空间(在我未包括的文件中)中,该函数是否仍然是模棱两可的调用?我对此有疑问,主要是因为对此question的讨论
最佳答案
这是它的工作原理...有3个基本步骤将源代码编译为可执行文件:
预处理
汇编
连结
在C ++中,这些步骤的重叠为零。 include指令是预处理器指令,因此在编译之前发生。模板实例化是编译的一部分,因此它发生在预处理之后。编译器不会在当前翻译单元之外搜索任何内容。因此,没有,ADL(编译时事件)无法搜索未包含的标头。
在注释中链接到Buzz的代码存在的问题是,您不知道标准标头包含或不包含哪些标头。 (好吧,您可以知道是否要查找它们,但是标准没有说明。)您的头文件中的任何一个都可以并且显然包含了<algorithm>
。一旦发生这种情况:
http://www2.roguewave.com/support/docs/leif/sourcepro/html/stdlibref/merge.html
由于ADL,您的版本与namespace std
中的定义之一不明确。
关于c++ - C++中用于参数依赖名称查找的规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4900939/