2012-09-14 8 views
30

In un file di intestazione di sistema, vedo l'espressione in questo modo:Che cos'è la dichiarazione "->" dopo la funzione?

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> 
{...} 

Non so che cosa "->" significa, non è puntatore espressione o lambda espressione, qualcuno mi può aiutare?

+4

A proposito, per Google il termine è "Trailing return type". – chris

risposta

47

È la nuova sintassi della dichiarazione di funzione da C++ 11 e si chiama "tipo di ritorno finale". Al termine di una dichiarazione di funzione, -> significa che il seguente è il tipo di ritorno della funzione. Può essere utilizzato solo quando viene utilizzata la parola chiave auto anziché un tipo di reso effettivo in cui normalmente lo si aspetterebbe.

Per esempio, queste due dichiarazioni sono compatibili:

int foo(); 
auto foo() -> int; 

A seconda dei gusti, si possono trovare più bella rispetto alla vecchia sintassi di dichiarazione, soprattutto quando il tipo di ritorno è estremamente lungo/complesso:

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>; 

Ma a volte può essere necessario con i modelli, quando il tipo di ritorno della funzione può variare con gli argomenti.

dire che si desidera una funzione template per aggiungere variabili:

template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
} 

che è grande, ma sarete solo in grado di aggiungere le variabili dello stesso tipo. Supponiamo che ti piacerebbe poter aggiungere variabili di qualsiasi tipo (come add((int)1, (double)2)).

template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
} 

Il problema è che non si può dire in anticipo quali il tipo di risultato di x + y sarà. Come i modelli stanno, potrebbero anche essere tipi non-integrali. (Non ti piacerebbe essere in grado di fare add(std::string("x"), "y")?)

Decltype, insieme alla nuova sintassi della dichiarazione di funzione, consente di risolvere questo problema.

template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
} 

Decltype "restituisce" il tipo di un'espressione. Poiché è necessarioe dichiarati per il decltype(x + y) per funzionare, è necessaria la nuova sintassi.

+0

È possibile accedere ai tipi di argomento anche con un tipo di ritorno regolare, poiché i parametri del modello vengono sempre dichiarati per primi. Ciò a cui non si ha accesso sono i nomi dei parametri o anche il nome della funzione. –

Problemi correlati