2016-01-25 36 views
6

z tym kodem (ważny C++ 11):nazwa funkcji w instrukcji if jest przekształcany w dziwny sposób

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

Pytanie jest w środku zestawienia if. Podczas gdy typeid zwraca mi coś, co wygląda na FbiE (co moim zdaniem jest językiem gcc dla typu funkcji), nie rozumiem, dlaczego ten typ jest niejawnie przekształcany w bool (tylko przykład, działa również z int).

Dlaczego instrukcja if kompiluje i ocenia true?

+8

Nazwa funkcji rozpada się na wskaźnik do tej funkcji, a wskaźniki są niejawnie wymienialne na 'bool', co daje" fałsz ", jeśli jest zero i" prawda "w przeciwnym razie. –

+0

@ T.C. dzięki! Jak tylko wiem, że zamienia się w wskaźniki, rozumiem, co się wtedy dzieje. – niosus

+5

Dając ci * wskazówki *, heh. – Quentin

Odpowiedz

9

Nie ma castingu w kodzie. Gips to wyraźna konwersja. Zakładam, że pytasz: Co robi niejawna konwersja funkcji na Bool?

Odpowiedź brzmi: funkcja jest konwertowana na wskaźnik funkcji. Następnie wskaźnik funkcji jest konwertowany na bool poprzez niejawną konwersję. Że konwersja jest zdefiniowany jako otrzymując:

  • false dla funkcji null pointer
  • true dla każdego innego wskaźnika funkcji

Więc w kodzie, ciało if (my_awesome_func) zawsze jest wpisany. (Przekonwertowanie rzeczywistej funkcji na wskaźnik funkcji nigdy nie daje zerowego wskaźnika).

+0

Dzięki! Masz rację, z pewnością miałem na myśli niejawne nawrócenie, ale nie mogłem sobie przypomnieć właściwego słowa (czasami wysysam po angielsku). Rozumiem dynamikę po przekonwertowaniu funkcji na wskaźnik funkcji, ale chciałbym przeczytać więcej na ten temat. Rozumiem, że nie wykonuje on konwersji w wywołaniu "typeid". Wiem, że jest to specyficzne dla samego 'typeid', ale może są inni faceci o podobnym zachowaniu – niosus