[英]C++ - Constructor overloading - private and public
你能告訴我為什么下面的代碼給我以下錯誤 - 調用重載“C(int)”是不明確的
我認為既然C(char x)是私有的,只有C(float)ctor從外部可見,應該通過將int轉換為float來調用。
但事實並非如此。
class C
{
C(char x)
{
}
public:
C(float t)
{
}
};
int main()
{
C p(0);
}
這在Scott Meyer的“Effective C ++”中討論過。 這個含糊不清的原因是他們希望確保僅僅改變成員的可見性不會改變其他地方已有代碼的含義。
否則,假設您的C類位於某個標題中。 如果你有一個私有的C(int)成員,你提出的代碼將調用C(浮點數)。 如果由於某種原因,C(int)成員被公開,舊代碼會突然調用該成員,即使舊代碼和它調用的函數都沒有改變 。
編輯:更多原因:
更糟糕的是,假設您有以下兩個功能:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
這兩個函數可以調用不同的函數,具體取決於foo或bar是否被聲明為C的朋友,或者A或B是否繼承它。 使用相同的代碼調用不同的函數是可怕的。
(這可能不如斯科特邁耶的討論那么好,但這就是主意。)
0是int
類型。 因為它可以隱式地轉換為float或char,所以調用是不明確的。 可見性與這些目的無關。
要么把0.0
, 0.
,或0.0f
,或擺脫了C(char)
完全構造。
編輯:標准的相關部分,第13.3節:
3)[...]但是,一旦確定了候選函數和參數列表,最佳函數的選擇在所有情況下都是相同的:
- 首先,選擇候選函數的子集 - 具有適當數量的參數並滿足某些其他條件的候選函數 - 以形成一組可行的函數(13.3.2)。
- 然后,基於將每個參數與每個可行函數的相應參數匹配所需的隱式轉換序列(13.3.3.1)來選擇最佳可行函數。
4)如果存在最佳可行功能並且是唯一的,則重載決策成功並將其作為結果產生。 否則重載解析失敗並且調用格式錯誤。 當重載決策成功,並且在使用它的上下文中無法訪問最佳可行功能(第11節)時,程序是不正確的。
請注意,可見性不是選擇過程的一部分。
我不這么認為:
C p(0);
正在被轉換為:
C(float t)
你可能需要這樣做:
C p(0.0f);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.