Istnieją pewne przypadki, w których należy użyć końcowego typu zwrotu. Przede wszystkim, zwracany typ lambda, jeśli został określony, musi być określony przez końcowy typ powrotu. Ponadto, jeśli twój typ zwracany używa decltype
, który wymaga, aby nazwy argumentów były w zakresie, musi być użyty końcowy typ zwracania (jednak zwykle można użyć declval<T>
do obejścia tego ostatniego problemu).
Końcowy typ powrotu ma kilka innych niewielkich zalet. Na przykład, rozważmy non-inline definicję funkcji członek metodą tradycyjną funkcję składni:
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
{
// ...
}
typedefs państwa nie są w zakresie aż po nazwie klasy pojawia się przed ::get_integers
, więc musimy powtarzać klasę kwalifikacje dwukrotnie . Jeśli używamy spływu typ zwracany, nie trzeba powtarzać nazwy typu:
auto my_awesome_type::get_integers() const -> integer_sequence
{
// ...
}
W tym przykładzie, to nie jest taka wielka sprawa, ale jeśli masz długie nazwy klasy lub funkcji Członka szablony klas, które nie są zdefiniowane w linii, może to znacznie zmienić czytelność.
W swoim "Fresh Paint" sesji w C++ Teraz 2012 Alisdair Meredith zwrócił uwagę, że jeśli używasz spływu rodzaje powrotne konsekwentnie, imiona wszystkich swoich funkcji w kolejce porządnie:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Użyłem końcowe typy powrotu wszędzie w CxxReflect, więc jeśli szukasz przykładu, w jaki sposób kod wygląda spójnie, możesz tam zajrzeć (np. the type
class).
To tam głównie dla 'decltype' na argumentach. –
co mówi CatPlusPlus: nie ma sensu używać go w twoim przykładzie. – stijn
@Cat Plus Plus Oznacza to, że zostawiasz rzeczy takie, jakie są w C++ 03, chyba że musisz wyprowadzić typ zwrotu? – mirk