2016-01-25 38 views
6

有了這個代碼(有效的C++ 11):函數名被轉換在陌生的方式

#include <stdio.h> 
#include <typeinfo> 

bool my_awesome_func(int param) { 
    return (param > 1); 
} 

int main(int argc, char const *argv[]) { 
    fprintf(stderr, "type of my_awesome_func: %s\n", 
      typeid(my_awesome_func).name()); 
    if (my_awesome_func) { 
    fprintf(stderr, "WHAT???\n"); 
    } 
    return 0; 
} 

的問題是,if語句的內部。雖然typeid返回給我看起來像FbiE(我認爲是函數類型的gcc語言)的東西,我不明白爲什麼這種類型被隱式轉換爲bool(只是一個例子,也適用於int)。

爲什麼if語句編譯並評估爲true?

+8

函數名稱衰減爲指向該函數的指針,並且指針可隱式轉換爲「bool」,如果爲空,則產生「false」,否則產生「true」。 –

+0

@ T.C。謝謝!只要我知道它轉換爲指針,我就會明白髮生了什麼。 – niosus

+5

給你一些*指針*,嘿。 – Quentin

回答

9

代碼中沒有強制轉換。劇組是一個明確的轉換。我假設你問:什麼隱式轉換爲布爾功能?

答案是:函數被轉換爲函數指針。然後通過隱式轉換將函數指針轉換爲bool。這種轉換是指產生:一個空函數指針

  • true任何其他函數指針
  • 因此,在你的代碼

    • falseif (my_awesome_func)身體總是輸入。 (將實際函數轉換爲函數指針永遠不會產生空指針)。

    +0

    謝謝!你是對的,我肯定意味着隱含的轉換,但不記得正確的詞(我有時會吸英文)。我理解函數轉換爲函數指針後的動態特性,但我想更多地閱讀它。我知道它不會在'typeid'調用中執行轉換。我知道'typeid'本身是特定的,但也許還有其他人有類似的行爲 – niosus