2017-09-03 135 views
0

我試圖找到我的代碼中的錯誤,並且發現了返回的函數名,隱式轉換爲布爾爲真:爲什麼存在將函數隱式轉換爲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?或者是其他東西?這很奇怪,通常當我在函數後面意外地離開括號時,我的編譯器通常會說「非標準使用函數調用」。

此外,這是如何有用的轉換?

+0

這不關乎有用。它只是一般語言規則的衍生物。 – StoryTeller

+0

*「這是如何有用的轉換」* - 這不是真的在這種情況下,但在一般情況下它是有道理的。 (if(somePointer))執行非空檢查是很普遍的(特別是在較老的代碼中)。對於函數指針,它和對象指針一樣好。在給定命名函數時,用一種特殊的語言來禁止這種轉換可以說是膨脹了。很簡單,沒有理由禁止它。這與'if(1)'做類似。 – cdhowie

回答

1

它是函數指針,所以它實際上返回類似於0xF7B3A1D0的東西,並且轉換爲真,因爲任何非零都是真的?

是的。

+1

更確切地說,它是一個零值檢驗,與* zero *沒有比較。僅僅因爲可以使用文字零來創建空指針常量,並不意味着零和零是相同的。 –

0

是的,理由是布爾檢查只是看它是否不假(又名0),如果它不是假的,那麼它是真的。

+1

「'false' aka null」是不正確的,因爲'false'實際上不是空指針常量 –

+0

@Ben Voigt所以我得到這個直接,它檢查是否它的零或不是,對吧?不知道你的意思是空指針常量。 – Zebrafish

+1

@斑馬魚:不,它檢查指針是否爲空指針。你可以寫一個空指針爲'0',但空指針和零不相同。只有文字'0'是一個空指針,算術評估爲零不是。 –

相關問題