2011-11-17 72 views
6

可能重複:
List of C++ name resolution (and overloading) rules函數重載在C++

什麼是編譯器如何決定哪些功能要在C++的規則? (這是給定的兩個函數具有相同的名稱 - 編譯器如何選擇/優先考慮另一個函數,主要是想知道編譯器選擇何種類型的編譯器時更願意執行)

+1

你的意思是壓倒一切嗎? – MGZero

+2

規則很多...並且很複雜。所有這些都在C++標準的** 3.4 **部分中涵蓋了。 –

+0

@MGZero - no ... – Belgi

回答

4

如前所述,規範在標準中有完整的描述。作爲一個基本的經驗法則,編譯器將選擇需要最少自動轉換的重載,但要注意的是它永遠不會應用2個用戶定義的轉換。

整數類型會自動轉換很多。因此,如果您的函數在intdouble上超載,則編譯將選擇int函數(如果使用一個整數常量調用)。如果您沒有int版本,編譯器會選擇double之一。在各種整數類型中,編譯器更喜歡整數常量爲int,因爲這是它們的類型。如果您在shortunsigned short上超載,但調用常量爲5,則編譯器會抱怨說無法確定要使用哪個超載。

Scott Meyers的書確實有我讀過的最好的解釋。

+0

「Scott Meyers的書」。你可以通過命名書名來更具體嗎? –

+0

對於我的生活,我現在找不到它。 +1給參考的任何人? – drdwilcox

+0

Scott Meyers的書:http://www.aristeia.com/books.html;該參考可能是有效的C++或可能更有效的C++。 – pnkfelix

0

整個函數名稱由您稱之爲函數以及參數列表組成。因此,從邏輯上講,兩個稱爲同一事物但具有不同參數列表的函數都有不同的「全名」。我的術語可能有點偏離,所以如果有人想糾正這個問題,請隨意。

+1

說你有doSomething(int x)和doSomething(short x),當你調用doSomething(5)時編譯器會選擇哪一個? – Tom

+0

啊,這讓它更有趣!好的問題,也超出了我的知識範圍。我覺得這取決於編譯器認爲5是什麼。我傾向於說int,但我不確定。 – MGZero

+1

它會選擇'int'版本。 – drdwilcox

0

它基於參數的類型。如果類型不匹配,則不涉及投射,只是不會編譯。

+0

查看我對MGZero的帖子的評論 – Tom

+0

對於我所知道的,如果你有void f(double x),並且你打電話給f(5),那麼comiles和5被鑄造成5.0 – Belgi