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++ 功能,称为 Argument Dependent Lookup,简称为 ADL。
来自cppreference:
参数相关查找,也称为 ADL,或 Koenig 查找 1,是 用于查找非限定函数名称的规则集 函数调用表达式,包括隐式函数调用 重载的运算符。这些函数名称可在 除了作用域和命名空间之外,它们的参数的命名空间 通过通常的不合格名称查找来考虑。