Є певні випадки, коли ви повинні використовувати кінцевий тип повернення. Найголовніше, тип лямбда-повернення, якщо він вказаний, повинен бути вказаний через кінцевий тип повернення. Крім того, якщо ваш тип повернення використовує a, decltype
який вимагає, щоб імена аргументів були в області дії, слід використовувати кінцевий тип повернення (однак, як правило, його можна використовувати declval<T>
для обходу останньої проблеми).
Тип кінцевого повернення має деякі інші незначні переваги. Наприклад, розглянемо визначення вбудованої функції-члена, використовуючи традиційний синтаксис функції:
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 члена не застосовується доти, доки назва класу не з’явиться раніше ::get_integers
, тому нам доведеться повторити кваліфікацію класу двічі. Якщо ми використовуємо кінцевий тип повернення, нам не потрібно повторювати ім'я типу:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
У цьому прикладі це не така вже й велика справа, але якщо у вас довгі імена класів або функції-члени шаблонів класів, які не визначені вбудовано, це може суттєво змінити читабельність.
У своїй сесії "Fresh Paint" на C ++ Now 2012 Алісдейр Мередіт зазначив, що якщо ви послідовно використовуєте кінцеві типи повернення, імена всіх ваших функцій акуратно вирівнюються:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Я використовував кінцевий повертаються типи всюди в CxxReflect , так що якщо ви шукаєте приклад того , як код виглядає використовувати їх послідовно, ви подивіться там (наприклад, можете клас ).type
decltype
аргументів.