2013-04-30 7 views
11

Oggi ho verificato Stroustrup's C++11 FAQ (modificato 7 Aprile 2013) e ho visto questo alla fine della sezione di tipo-alias:Esiste un nuovo formato di espressione del tipo di funzione in C++ 11?

typedef void (*PFD)(double); // C style 
using PF = void (*)(double); // using plus C-style type 
using P = [](double)->void;  // using plus suffix return type 

dove un introduttore lambda viene utilizzato per avviare un tipo di espressione funzione generale che utilizza un tipo di ritorno in stile suffisso. È questa funzione ufficiale o una versione beta/lista desideri? Se è ufficiale, come funzionerebbe per le funzioni dei membri non statici?

risposta

11
using P = [](double)->void; 

non è ufficiale. Bjarne è noto per essere un po 'incurante nelle sue domande frequenti.

Nei funziona, tuttavia, sono le seguenti:

using P1 = auto(double) -> void; 
using P2 = auto(*)(double) -> void; 

Dove P1 è un tipo di funzione, ed è un tipo P2 funzione puntatore. Forse era questa la sua intenzione.

+0

Quindi la terza voce di Bjarne sta sfruttando la conversione stateless-lambda = to = regular-function, giusto? Proprio prima di leggere questo, ho sperimentato e ho scoperto che "auto (MyClass :: *) (Whatever) CV -> ReturnType'" funziona. – CTMacUser

+0

@CTMacUser: No, non lo è. 'using' si aspetta un tipo,' [] (stuff) -> stuff' è un oggetto lambda incompleto. E sì, questa è la sintassi, proprio come un normale puntatore funzione-membro, tranne che con un tipo di ritorno finale. – Xeo

0

La sintassi lambda non funziona con funzioni membro non statiche poiché la funzione puntatore-a-capo e quella puntatore-membro sono implementate in modo diverso. La funzione da puntatore a membro non è un puntatore regolare. Non tiene "l'esatto indirizzo" come fa un puntatore regolare. Possiamo immaginare che contiene "l'indirizzo relativo" di dove la funzione si trova nel layout di classe.

Se è necessario passare il puntatore alla funzione membro da qualche parte, cosiderare std :: uso della funzione.

+0

Oh, stavo facendo questa domanda per aspetto, non per uso. La risposta di @Xeo mi ha dato ciò di cui avevo bisogno. – CTMacUser