Non riesco a capirlo:
int main() {
int (*) (int *) = 5;
return 0;
}
L'assegnazione sopra viene compilata con g ++ c ++ 11. So che int (*) (int *)
è un puntatore a una funzione che accetta un (int *)
argomento come e restituisce un int, ma non capisco come potresti equipararlo a 5. All'inizio ho pensato che fosse una funzione che restituisce costantemente 5 (dal mio recente apprendimento in F #, probabilmente, haha), poi ho pensato, brevemente, che il puntatore a funzione punta alla posizione di memoria 5, ma questo non funziona, chiaramente, e nemmeno i valori esadecimali.
Pensando che potrebbe essere perché la funzione restituisce un int e che l'assegnazione di un int è ok (in qualche modo), ho provato anche questo:
int * (*) (int *) = my_ptr
dove my_ptr
è di tipo int *
, lo stesso tipo di questo secondo puntatore a funzione, come nel primo caso con tipo int. Questo non si compila. Assegnare 5, o qualsiasi valore int, invece di my_ptr
, non viene compilato neanche per questo puntatore a funzione.
Allora cosa significa l'incarico?
Aggiorna 1
Abbiamo la conferma che si tratta di un bug, come mostrato nella migliore risposta. Tuttavia, non è ancora noto cosa accada effettivamente al valore che si assegna al puntatore a funzione o cosa succede con l'assegnazione. Qualsiasi (buona) spiegazione in merito sarebbe molto apprezzata! Fare riferimento alle modifiche di seguito per maggiore chiarezza sul problema.
Modifica 1
Sto usando la versione 4.8.2 di gcc (in Ubuntu 4.8.2)
Modifica 2
In realtà, equipararlo a qualsiasi cosa funziona sul mio compilatore. Anche equipararlo a una variabile std :: string, o un nome di funzione che restituisce un double, funziona.
Modifica 2.1
È interessante notare che, renderlo un puntatore a una funzione che restituisce un tipo di dati che non è un puntatore, consentirà la compilazione, ad esempio
std::string (*) () = 5.6;
Ma non appena il puntatore a una funzione è a una funzione che restituisce un puntatore, non si compila, come con
some_data_type ** (*) () = any_value;