命名空间范围的模板函数在另一个命名空间中可见

Yve*_*ier 3 c++ namespaces

我遇到了一个奇怪的命名空间范围行为(使用g ++ 4.8.2).为了解释这个问题,我提取了一个重现这种奇怪行为的最小代码:

namespace Weird {
  template <typename T>
    struct Rec
    {
      T val;
      Rec( T const& _val ) : val( _val ) {}
    };

  template <typename T>
    Rec<T>
    foo( Rec<T> const& r )
    {
      return Rec<T>( r.val * 2 );
    }

};

Weird::Rec<double>
bar( Weird::Rec<double> const& _input )
{
  return foo( _input );
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我希望G ++抱怨"foo"没有被定义在"bar"的范围内,事实并非如此; 代码只是编译好.

所以我有点困惑.g ++是错误的(命名空间泄漏)?或者如果没有,根据哪种机制"foo"在"bar"中变得可见?

eca*_*mur 9

这是依赖于参数的查找(ADL),也称为Koenig查找.

简而言之,使用运算符或未加修饰的函数调用将在操作数或参数的封闭名称空间中查找名称.