In alcuni casi è necessario utilizzare un tipo di ritorno finale. In particolare, un tipo di ritorno lambda, se specificato, deve essere specificato tramite un tipo di ritorno finale. Inoltre, se il tuo tipo di ritorno utilizza uno decltype
che richiede che i nomi degli argomenti siano in ambito, deve essere utilizzato un tipo di ritorno finale (tuttavia, è possibile utilizzare in genere declval<T>
per aggirare quest'ultimo problema).
Il tipo di ritorno finale presenta altri vantaggi minori. Ad esempio, si consideri una definizione di funzione membro non in linea con il tradizionale sintassi della funzione:
struct my_awesome_type
{
typedef std::vector<int> integer_sequence;
integer_sequence get_integers() const;
};
my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
// ...
}
typedef membri non sono di portata fino a dopo il nome della classe appare prima ::get_integers
, quindi dobbiamo ripetere la qualifica di classe due volte . Se si usa un tipo di ritorno finale, non abbiamo bisogno di ripetere il nome del tipo:
auto my_awesome_type::get_integers() const -> integer_sequence
{
// ...
}
In questo esempio, non è un grosso problema, ma se si dispone di nomi lunghi di classe o funzioni membro della i modelli di classe che non sono definiti in linea, possono fare una grande differenza nella leggibilità.
Nel suo "Fresh Paint" sessione in C++ Ora 2012, Alisdair Meredith ha sottolineato che se si utilizza finali tipi restituiti in modo coerente, i nomi di tutte le funzioni in fila ordinatamente:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
ho usato i tipi di ritorno finali dappertutto in CxxReflect, quindi se stai cercando un esempio di come il codice sembra utilizzarli in modo coerente, puoi dare un'occhiata lì (ad esempio, the type
class).
è lì principalmente per 'decltype' su argomenti. –
cosa dice CatPlusPlus: non ha molto senso utilizzarlo nell'esempio – stijn
@Cat Plus Plus Ciò significa che si lasciano le cose come sono in C++ 03, a meno che non sia necessario ricavare il tipo restituito? – mirk