代码在Visual Studio 2010中编译,但根本不应编译

时间:2012-03-22 09:50:14

标签: c++ compiler-errors

以下源代码使用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位同事)忽略了什么?

2 个答案:

答案 0 :(得分:9)

您遇到的问题归因于ADLArgument Dependent Lookup)。

您的代码段没有任何问题(除了链接器可能会抱怨NS::Y未定义),但它应该编译 - VS2012正在处理它应该的代码段。

由于参数NS::Yx)的类型在适当的范围内,编译器会找到NS::X


  

3.4.2 依赖于参数的名称查找 [ basic.lookup.argdep ]

     
      
  1. 当一个非限定名称用作a中的postfix-expression时   函数调用(5.2.2),其他名称空间不考虑   可以搜索通常不合格的查找(3.4.1),并在那些中查找   名称空间,名称空间范围的朋友函数声明(11.4)没有   否则可以看到。

         

    对搜索的这些修改取决于搜索的类型   参数(以及模板模板参数,...的命名空间   模板参数)。

  2.   
  3. 对于函数调用中的每个参数类型T,有一组零个或多个关联的命名空间以及一组零或多个   要考虑的相关课程。

         

    命名空间和   类完全由函数参数的类型决定   (以及任何模板模板参数的名称空间)。

  4.   

答案 1 :(得分:3)

这是有效的C ++代码。它是在argument-dependent lookup适用于此处编译的。