繁体   English   中英

为什么 ADL 不能使用命名空间外定义的函数?

[英]Why doesn't ADL work with functions defined outside of a namespace?

我知道下面示例中的编译器将执行 function First::fun() ,因为参数依赖名称查找 (ADL)/Koenig 查找并且为了执行Second::fun()这需要显式调用在main function。

#include <iostream>
using namespace std;

namespace First
{
    enum Enum
    {
        FIRST
    };

    void fun(First::Enum symbol)
    {
        cout << "First fun\n";
    }
}

namespace Second
{
    void fun(First::Enum symbol)
    {
        cout << "Second fun\n";
    }
}

int main()
{
    fun(First::FIRST);  // Calls First::fun()
}

但是,当在命名空间之外添加另一个 function fun()时(请参见下面的代码)并在没有前缀命名空间的情况下调用fun()时,编译器会给出歧义错误。 命名空间内的函数仍然可以通过显式命名空间前缀来调用,但是fun()是不可访问的。 当没有显式调用时,为什么编译器不喜欢命名空间之外的 function? 是否有特定原因可以避免这种行为?

// ^ Namespaces are still here

fun(First::Enum symbol)
{
    cout << "No namespace fun\n";
}    

int main()
{
    fun(First::FIRST);  // Doesn't compile: ambiguity!
}

编辑

正如Yksisarvinen正确指出的那样,全局fun()仍然可以通过使用全局命名空间作为前缀来调用: ::fun(First::FIRST); .

然而,这仍然给我留下了一个问题:为什么编译器不喜欢在模棱两可的调用中使用全局fun()

为什么编译器不喜欢模棱两可的调用中的全局fun()

global fun是通过unqualified name lookup找到的, First::fun是通过ADL找到的,两者都放在重载集中,重载解析不能 select 一个。

这些 function 名称在其 arguments 的名称空间中查找,除了通常的非限定名称查找所考虑的范围和名称空间之外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM