2013-05-16 5 views
36

direkt Entnommen http://herbsutter.com/2013/05/09/gotw-1-solution/C++ 's drängendsten Parsen wieder

Während widget w(); für mich klar ist, habe ich keine Ahnung, wie der folgende Code eine Funktionsdeklaration sein kann?

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

Wie ist das möglich?

+0

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

Antwort

44

In einer Funktionsdeklaration, Argumente vom Typ ARRAY Zerfalls in Zeiger auf das erste Element, Argumente der Funktion Zerfallstyp in einen Funktionszeiger, so würde die Signatur sein:

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

Das heißt, eine Funktion, die nimmt als erstes Argument einen Zeiger auf eine Funktion keine Argumente nehmen und gadget Rückkehr, die einen Zeiger auf eine Funktion keine Argumente nehmen und Zurückgeben ein doodad und dass die Funktion selbst liefert ein widget

Es gibt noch mehr als zweites Argument interessant oder verwirrt singen Fällen wie:

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

Wie konnte , die als Funktionsdeklaration interpretiert werden? Ich meine, x ist eine Variable, oder? Wenn Sie eine Variable deklarieren, können Sie zusätzliche Klammern hinzufügen, so dass gadget x; und gadget (x); beide die gleiche Variable x deklarieren. Gleiches gilt Argumente funktionieren so über den Code wie eine Deklaration einer Funktion sieht, der ein erstes Argument x vom Typ namens gadget und gibt ein widget ...

+46

Mutter Gottes. 12_ಠ – Yanko

+1

+1 das erste Mal wissen, dass Argumente vom Typ Funktion in einen Funktionszeiger zerfallen. Danke! – taocp

+4

@Yanko: Natürlich können Sie jetzt 'widget w {gadget {}, doodad {}};' => das kann nicht als Funktion missverstanden werden :) –

1

Es ist Funktion, die zwei Funktionen erhält, die gadget und doodad zurück und keiner von ihnen bekommt Argumente.

Beispiel, das gut kompiliert.

#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