簡體   English   中英

為什么成員函數的重載解析會排除全局函數?

[英]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 我認為這可能是一個很大的陷阱。

我只是好奇:

為什么成員函數的重載解析會排除全局函數?

有什么根據?

作為B類的設計師,我可能不知道B的基類

我不同意

為什么成員函數的重載解析會排除全局函數?

因為這兩個重載屬於兩個不同的作用域,所以編譯器選擇相同作用域的重載。 閱讀第3.4.1節。 所述f的內(相同)范圍隱藏外部的f

有什么根據?

要有一個堅實的規則。 我們更喜歡在相同的范圍內工作。 除非我們明確要從其他地方調用對象。

在一個打電話給亞歷克斯的家庭中,他們希望自己的小男孩亞歷克斯進來,而不是馬其頓亞歷山大三世

這就是過載解析的工作方式, 這很好

想象一下,您確實有一個很大的項目,大量的相互依賴關系,第三方代碼和跨模塊的內容。 在這個巨大的混亂中,您只有一個知道的課程。 它已經完美運行了5年,高效,易於閱讀和清潔。 您不想碰它。 然后,您升級模塊,並開始出現編譯器錯誤。 不好了! 該模塊(您無法控制DoAmazingStuff()在全局名稱空間中引入了新函數DoAmazingStuff() 與我們類中的方法名稱相同。 您將不得不對其進行重構,因為現在您不能再為類成員使用相同的名稱。 mm!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM