2013-05-16 8 views
36

estrapolate direttamente dal http://herbsutter.com/2013/05/09/gotw-1-solution/più fastidioso parse C++ 's nuovo

Mentre widget w(); è chiaro per me, non ho idea di come può essere il codice di seguito una dichiarazione di funzione?

// same problem (gadget and doodad are types) 
// 
widget w(gadget(), doodad()); // pitfall: not a variable declaration 

Com'è possibile?

+0

correlati/vittima: http://stackoverflow.com/questions/9327505/about-pointers-to-functions-in-function-declarations – jrok

risposta

44

In una dichiarazione di funzione, argomenti di tipo array decadimento nel puntatori al primo elemento, argomenti della funzione tipo decadimento in un puntatore alla funzione, quindi la firma sarebbe:

widget w(gadget(*)(), doodad(*)()); 

Cioè, una funzione che prende come primo argomento un puntatore a una funzione di prendere senza argomenti e restituendo gadget, che prende come secondo argomento un puntatore a una funzione di prendere senza argomenti e restituendo un doodad e che la funzione stessa restituisce un widget

ci sono ancora più interessante o confuso cantare casi, come:

// assume 'x' is a variable defined somewhere: 
widget w(gadget(x)); 

Come poteva che essere interpretato come una dichiarazione di funzione? Voglio dire, x è una variabile, giusto? Bene, quando si dichiara una variabile è possibile aggiungere una parentesi aggiuntiva, quindi gadget x; e gadget (x); dichiarano entrambi la stessa variabile x. Lo stesso vale per funzionare argomenti in modo che il codice di cui sopra appare come una dichiarazione di una funzione che prende un primo argomento di nome x di tipo gadget e restituisce una widget ...

+46

Madre di Dio. ಠ_ಠ – Yanko

+1

+1 prima volta sapendo che gli argomenti della funzione tipo decadono in un puntatore di funzione. grazie! – taocp

+4

@Yanko: ovviamente, ecco perché ora puoi usare 'widget w {gadget {}, doodad {}};' => questo non può essere erroneamente interpretato come una funzione :) –

1

E 'la funzione che ottiene due funzioni, che restituisce gadget e doodad e nessuno di loro non ha argomenti.

Esempio che compila bene.

#include <iostream> 
class widget{}; 
class gadget{}; 
class doodad{}; 
gadget a(){} 
doodad b() {}; 
widget w(gadget(), doodad()){ 
} 
int main() { 
    w(a,b); 
    return 0; 
} 

http://ideone.com/YjZK9Y