调用没有命名空间的函数,这是一个功能还是一个错误?

问题描述 投票:0回答: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 编译器,它们都可以工作。

c++ function namespaces
1个回答
0
投票

这是一个功能还是编译器错误?

这是一个 C++ 功能,称为 Argument Dependent Lookup,简称为 ADL

来自cppreference

参数相关查找,也称为 ADL,或 Koenig 查找 1,是 用于查找非限定函数名称的规则集 函数调用表达式,包括隐式函数调用 重载的运算符。这些函数名称可在 除了作用域和命名空间之外,它们的参数的命名空间 通过通常的不合格名称查找来考虑。

© www.soinside.com 2019 - 2024. All rights reserved.