2016-01-25 7 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文の中にあります。 typeidFbiE(私は関数型のgcc言語だと思う)のようなものを返しますが、なぜこの型が暗黙のうちにboolに変換されているのか分かりません(ちょうど例、intでも動作します)。

なぜifステートメントがコンパイルされ、真と評価されますか?

+8

関数名はその関数へのポインタに減衰し、ポインタは暗黙のうちに 'bool'に変換され、NULLの場合は' false'を返し、それ以外の場合は 'true'を返します。 –

+0

@ T.C。ありがとう!それがポインタに変換されることを知ったらすぐに何が起こるのか理解します。 – niosus

+5

あなたにいくつかのポインタ*、hehを与えます。 – Quentin

答えて

9

コードにキャスティングがありません。キャストは明示的な変換です。私はあなたが質問していると仮定します:ブール関数の暗黙の変換は何をしますか?

その答えは、関数ポインタに変換されます。関数ポインタは暗黙の変換によってboolに変換されます。その変換が生じるように定義されます。

  • falseを他の関数ポインタコード内ので

にnull関数ポインタ

  • trueため、if (my_awesome_func)の身体は常に入力されます。 (実際の関数を関数ポインタに変換すると、NULLポインタは決して得られません)。

  • +0

    ありがとう!あなたは正しいです、私は間違いなく暗黙の変換を意味しましたが、適切な言葉を覚えていませんでした(私は時々英語を吸う)。私は関数が関数ポインタに変換された後のダイナミクスを理解していますが、それについてもっと読んでみたいと思います。私は 'typeid'呼び出しで変換を実行しないことを理解しています。私はそれが 'typeid'自体に特有であることは知っていますが、おそらく同様の振る舞いを持つ他の人がいます – niosus