È 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.
A proposito, per Google il termine è "Trailing return type". – chris