[英]Why does the overload resolution of member functions exclude the global functions?
void f()
{}
struct A
{
void f()
{}
};
struct B : A
{
B()
{
f(); // A::f() is always called, and ::f is always ignored
}
};
int main()
{
B();
}
作為類B
的設計師,我可能不知道B
的基類(即A
)具有成員函數A::f
的事實,我只知道::f
,而調用::f
正是我想要的。
我期望編譯器由於調用f
的歧義而給出錯誤。 但是,編譯器始終選擇A::f
並忽略::f
。 我認為這可能是一個很大的陷阱。
我只是好奇:
為什么成員函數的重載解析會排除全局函數?
有什么根據?
這就是過載解析的工作方式, 這很好 。
想象一下,您確實有一個很大的項目,大量的相互依賴關系,第三方代碼和跨模塊的內容。 在這個巨大的混亂中,您只有一個知道的課程。 它已經完美運行了5年,高效,易於閱讀和清潔。 您不想碰它。 然后,您升級模塊,並開始出現編譯器錯誤。 不好了! 該模塊(您無法控制DoAmazingStuff()
在全局名稱空間中引入了新函數DoAmazingStuff()
。 與我們類中的方法名稱相同。 您將不得不對其進行重構,因為現在您不能再為類成員使用相同的名稱。 mm!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.