簡體   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