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

Namespace-scoped template function becomes visible in another namespace

本文关键字:命名空间 另一个 函数 范围      更新时间:2023-10-16

我遇到了一个奇怪的命名空间范围行为(使用 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 );
}

在这个代码中,我希望 G++ 抱怨 "foo" 没有在 "bar" 范围内定义,但事实并非如此;代码编译得很好。

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

这就是参数依赖查找(ADL),也称为Koenig查找。

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