以下源代码使用Visual Studio 2010正确编译:
namespace NS
{
class X
{
};
X Y(X str);
}
void myFun()
{
NS::X x;
Y(x);
}
(这是简化的代码,其中我所有的类和函数名称已被X,Y,...替换)。
我希望行Y(x)
无法编译,因为它应该是NS::Y(x)
。
使用以下命令编译此源代码
cl /c file.cpp
此处不包含其他文件,没有其他命令行选项。
为什么这个文件会编译? VS2010中的错误?或者我(以及我的其他3位同事)忽略了什么?
答案 0 :(得分:9)
您遇到的问题归因于ADL
(Argument Dependent Lookup)。
您的代码段没有任何问题(除了链接器可能会抱怨NS::Y
未定义),但它应该编译 - VS2012正在处理它应该的代码段。
由于参数NS::Y
(x
)的类型在适当的范围内,编译器会找到NS::X
。
3.4.2 依赖于参数的名称查找 [ basic.lookup.argdep ]
当一个非限定名称用作a中的postfix-expression时 函数调用(5.2.2),其他名称空间不考虑 可以搜索通常不合格的查找(3.4.1),并在那些中查找 名称空间,名称空间范围的朋友函数声明(11.4)没有 否则可以看到。
对搜索的这些修改取决于搜索的类型 参数(以及模板模板参数,...的命名空间 模板参数)。
- 醇>
对于函数调用中的每个参数类型T,有一组零个或多个关联的命名空间以及一组零或多个 要考虑的相关课程。
命名空间和 类完全由函数参数的类型决定 (以及任何模板模板参数的名称空间)。
答案 1 :(得分:3)
这是有效的C ++代码。它是在argument-dependent lookup适用于此处编译的。