2016-01-25 4 views
6

Mit diesem Code (gültig C++ 11) umgewandelt:Funktionsname in if-Anweisung ist auf seltsame Weise

#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; 
} 

Die Frage innerhalb der if Aussage. Während typeid mir etwas zurückgibt, das wie FbiE aussieht (was ich glaube, ist gcc Sprache für Funktionstyp) Ich verstehe nicht, warum dieser Typ implizit in bool konvertiert wird (nur ein Beispiel, funktioniert auch mit int).

Warum kompiliert und bewertet die if-Anweisung "true"?

+8

Funktionsname verfällt zu einem Zeiger auf diese Funktion, und Zeiger sind implizit in 'bool' umwandelbar, was' false' ergibt, wenn es null ist und andernfalls 'true'. –

+0

@ T.C. Vielen Dank! Sobald ich weiß, dass es in Zeiger konvertiert, verstehe ich, was dann passiert. – niosus

+5

Ich gebe Ihnen einige * Zeiger *, heh. – Quentin

Antwort

9

In Ihrem Code ist kein Casting vorhanden. Ein Cast ist eine explizite Conversion. Ich nehme an, Sie fragen: Was macht implizite Konvertierung einer Funktion zu bool tun?

Die Antwort darauf lautet: Die Funktion wird in einen Funktionszeiger umgewandelt. Dann wird der Funktionszeiger über implizite Konvertierung in bool konvertiert. Diese Umwandlung als Nachgeben definiert:

  • false für einen Null-Funktionszeiger
  • true für andere Funktionszeiger

Also in Ihrem Code, der Körper von if (my_awesome_func) immer eingegeben. (Das Konvertieren einer tatsächlichen Funktion in einen Funktionszeiger ergibt niemals einen Nullzeiger).

+0

Danke! Du hast recht, ich meinte sicherlich die implizite Konvertierung, aber ich konnte mich nicht an das richtige Wort erinnern (manchmal lutsche ich Englisch). Ich verstehe die Dynamik, nachdem die Funktion in einen Funktionszeiger umgewandelt wurde, aber dazu möchte ich mehr lesen. Ich verstehe, dass es die Konvertierung in dem 'typeid'-Aufruf nicht ausführt. Ich weiß, dass das spezifisch für Typid selbst ist, aber vielleicht gibt es andere Typen mit ähnlichem Verhalten – niosus