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

Pat*_*ick 5 c++ compiler-errors

以下源代码与Visual Studio 2010正确编译:

namespace NS
   {
   class X
      {
      };   
   X Y(X str);
   } 

void myFun()
   {
   NS::X x;
   Y(x);
   }
Run Code Online (Sandbox Code Playgroud)

(这是减少的代码,其中所有我自己的类和函数名称已被X,Y,...替换)

我希望该行Y(x)无法编译,因为它应该是NS::Y(x).

使用以下命令编译此源代码

cl /c file.cpp
Run Code Online (Sandbox Code Playgroud)

此处不包含其他文件,没有其他命令行选项.

为什么这个文件编译?VS2010中的错误?或者我和我的其他3位同事忽略了什么?

Fil*_*efp 9

你正在经历的是ADL(Argument Dependent Lookup).

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

NS::Y由于参数x(NS::X)的类型在适当的范围内,编译器会发现.


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

  1. 当在函数调用(5.2.2)中使用非限定名称作为后缀表达式时,可以搜索在通常的非限定查找(3.4.1)期间未考虑的其他名称空间,并且在这些名称空间中,名称空间范围的朋友函数声明(11.4)可能无法看到.

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

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

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

  • @LuchianGrigore没有bug,片段编译.链接器找不到`NS :: Y`的定义.构建可执行文件时有几个步骤. (2认同)