在下面的測試程序中,使用bool謂詞調用checkit
方法而不是調用整數過載。爲什麼?C++ bool表達式作爲函數參數調用錯誤的過載
(i == 10)
應該創建一個布爾值,然後應該觸發bool重載被調用,否?
程序輸出
should be int
I'm a bool 1
should be bool
I'm a bool 1
should also be bool
I'm a int 1
來源
class Overload
{
public:
void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkit(long n) { printf(" I'm a long %ld\n", n); }
void checkit(int n) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkit((i == 10));
}
編輯
咄!對於錯字感到抱歉。
但是,在修正打字錯誤和註釋bool方法後,int方法使用bool謂詞調用。如果沒有找到更合適的簽名,是否存在從bool到int的默認轉換?嚴格地說,沒有bool
簽名,所以我期待無論是編譯或運行時錯誤...
更新的代碼
class Overload
{
public:
//void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkIt(long n) { printf(" I'm a long %ld\n", n); }
void checkIt(int n) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkIt((i == 10));
}
更新的輸出
should be int
I'm a int 10
should be bool
I'm a int 1
should also be bool
I'm a int 1
您只有一個名爲'checkIt'的函數的重載,所以這是唯一可以調用的函數。有兩個與名稱不同的函數無關的重載「checkit」。 –
看起來像一個錯字。將所有'checkit'改爲'checkIt'會得到預期的結果。 – InternetAussie
是的,有一個從'bool'到'int'的標準轉換。 – AnT