[英]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.