c++ - 具有类参数的函数从命名空间中泄漏?

标签 c++ namespaces argument-dependent-lookup

我在这里有一小段代码供您考虑,这让我很困惑。奇怪的是它可以在 Sun Studio 和 GCC 上编译,尽管我认为它不应该。

考虑一下:

namespace name
{
  class C
    {
      int a;
    };

  void f(C c);
  void g(int a);
}

int main(int argc, char** argv)
{
  name::C c;

  name::f(c); 
  f(c);  // <--- this compiles, strangely enough

  name::g(42);
  // g(42);  <--- this does not, as I expected
}

来自同一命名空间的类参数导致函数 f 从命名空间“泄漏”出来,并且可以在没有 name:: 的情况下访问。

有人对此有解释吗?肯定是我错了,而不是编译器错了。

最佳答案

它叫做 argument-dependent lookup (或 Koenig 查找)。简而言之,编译器会在作为参数类型命名空间的命名空间中查找函数。

关于c++ - 具有类参数的函数从命名空间中泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886478/

相关文章:

c++ - 指定应调用非成员函数而不是成员函数

c++ - 将 GpuMat 行复制到 std::vector

c++ - codecvt_utf8<wchar_t> 被转换为原生 codecvt<wchar_t, char>

c# - 添加了引用但无法识别命名空间

docker-compose 和用户命名空间

c++ - 如何编写具有高重载优先级的类标准函数

c++ - 图片熵计算

c++ - 'undefined'怎么可能是竞争条件?

php - 类与插件框架冲突 - PHP/Wordpress

c++ - 什么是 "Argument-Dependent Lookup"(又名 ADL,或 "Koenig Lookup")?