2016-01-25 19 views
6

Con questo codice (valido C++ 11):nome della funzione if è convertito in uno strano modo

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

La questione è all'interno della dichiarazione if. Mentre typeid mi restituisce qualcosa che assomiglia a FbiE (che penso sia lingua gcc per tipo di funzione) Non capisco perché questo tipo viene convertito implicitamente in bool (solo un esempio, funziona anche con int).

Perché l'istruzione if viene compilata e valutata true?

+8

Il nome della funzione decade in un puntatore a tale funzione e i puntatori sono implicitamente convertibili in 'bool', restituendo' false' se è null e 'true' in caso contrario. –

+0

@ T.C. Grazie! Non appena so che si converte in puntatori, capisco cosa succede allora. – niosus

+5

Dandoti alcuni * puntatori *, heh. – Quentin

risposta

9

Non c'è alcuna trasmissione nel codice. Un cast è una conversione esplicita. Presumo che tu stia chiedendo: Che cosa fa la conversione implicita di una funzione in bool?

La risposta è: la funzione viene convertita in un puntatore di funzione. Quindi il puntatore della funzione viene convertito in bool tramite conversione implicita. Che la conversione è definito come rendimento:

  • false per un puntatore a funzione nulla
  • true per qualsiasi altro puntatore a funzione

Quindi, nel codice, il corpo di if (my_awesome_func) è sempre inserito. (La conversione di una funzione reale in un puntatore a una funzione non produce mai un puntatore nullo).

+0

Grazie! Hai ragione, intendevo sicuramente la conversione implicita, ma non riuscivo a ricordare la parola giusta (a volte mi succhio in inglese). Capisco le dinamiche dopo che la funzione è stata convertita in un puntatore a funzione, ma mi piacerebbe saperne di più su questo. Capisco che non esegue la conversione nella chiamata 'typeid'. So che è specifico per 'typeid' stesso, ma forse ci sono altri ragazzi con un comportamento simile – niosus