代码之家  ›  专栏  ›  技术社区  ›  hczstev

调用没有名称空间的函数,这是一个特性还是一个bug?复制

  •  0
  • hczstev  · 技术社区  · 1 年前
    namespace ns {
        void f() {}
    
        struct Foo {};
        void foof(Foo) {};
    }
    int main() {
        // f(); // cannot find f
        foof(ns::Foo{}); // call to ns::foof(Foo)
    }
    

    我发现,当调用在同一名称空间中定义了类型的函数时,我们可以省略名称空间。 我在cppreference命名空间中找不到此规则。这是一个特性还是编译器错误?

    我尝试了几个gcc和clang编译器,它们都能工作。

    1 回复  |  直到 1 年前
        1
  •  0
  •   wohlstad    1 年前

    这是一个特性还是编译器错误?

    这是一个名为的c++功能 参数相关查找 ADL .

    从…起 cppreference :

    参数相关查找,也称为ADL或Koenig查找 1 是 在中查找不合格函数名的规则集 函数调用表达式,包括对的隐式函数调用 过载的操作员。这些函数名在 除了作用域和名称空间之外,其参数的名称空间 通过通常的非限定名称查找来考虑。

    在您的情况下,因为您为 Foo 参数,编译器能够查找该函数 foof 在同一命名空间中。