我試圖找到我的代碼中的錯誤,並且發現了返回的函數名,隱式轉換爲布爾爲真:爲什麼存在將函數隱式轉換爲bool?
bool isArabicNumeral(char arg) { /* Details not important*/ };
bool isValidVarNameFirstChar(char arg) { /* Details not important */ }
bool isValidVarNameContinuationChar(char arg)
{
return isValidVarNameFirstChar || isArabicNumeral(arg) ? true : false;
// I forgot to write the brackets after isValidVarNameFirstChar
// so the function wasn't called. This always returns true.
}
所以我發現C++允許轉換到bool任何地方它的對於這樣的轉換有用的發生,所以我可以做:
void afunction() {};
int main()
{
bool boolVariable = afunction; // This works
int intVariable = afunction; // This doesn't work
return 0;
}
我的問題是,我明白,有從功能的隱式轉換爲bool,但爲什麼它總是返回true。另外,實際上轉換爲bool的是什麼?它是函數指針,所以它實際上返回類似於0xF7B3A1D0的東西,並且轉換爲真,因爲任何非零都是真的?或者它是否返回函數typename?或者是其他東西?這很奇怪,通常當我在函數後面意外地離開括號時,我的編譯器通常會說「非標準使用函數調用」。
此外,這是如何有用的轉換?
這不關乎有用。它只是一般語言規則的衍生物。 – StoryTeller
*「這是如何有用的轉換」* - 這不是真的在這種情況下,但在一般情況下它是有道理的。 (if(somePointer))執行非空檢查是很普遍的(特別是在較老的代碼中)。對於函數指針,它和對象指針一樣好。在給定命名函數時,用一種特殊的語言來禁止這種轉換可以說是膨脹了。很簡單,沒有理由禁止它。這與'if(1)'做類似。 – cdhowie