In C ++ 11, ci sono due sintassi per la dichiarazione di funzione:
dichiarazioni- argomento dell'identificatore del tipo di ritorno (
... )
e
auto
identificatore (
argomento-dichiarazioni ... )
->
return_type
Sono equivalenti. Ora, quando sono equivalenti, perché mai vuoi usare quest'ultimo? Bene, C ++ 11 ha introdotto questa decltype
cosa interessante che ti consente di descrivere il tipo di espressione. Quindi potresti voler derivare il tipo restituito dai tipi di argomento. Quindi provi:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
e il compilatore ti dirà che non sa cosa a
e b
sono decltype
nell'argomento. Questo perché sono dichiarati solo dalla lista degli argomenti.
È possibile aggirare facilmente il problema utilizzando declval
e i parametri del modello già dichiarati. Piace:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
tranne che sta diventando davvero prolisso ora. Quindi la sintassi della dichiarazione alternativa è stata proposta e implementata e ora è possibile scrivere
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
ed è meno dettagliato e le regole di scoping non hanno bisogno di cambiare.
Aggiornamento C ++ 14: C ++ 14 consente anche solo
auto
identificatore (
argomento-dichiarazioni ... )
purché la funzione sia completamente definita prima dell'uso e tutte le return
istruzioni deducano allo stesso tipo. La ->
sintassi rimane utile per le funzioni pubbliche (dichiarate nell'intestazione) se si desidera nascondere il corpo nel file di origine. Un po 'ovviamente che non può essere fatto con i template, ma ci sono alcuni tipi concreti (di solito derivati dalla metaprogrammazione dei template) che sono difficili da scrivere altrimenti.