В определенных случаях необходимо использовать завершающий возвращаемый тип. В частности, лямбда-тип возврата, если он указан, должен быть указан через конечный возвращаемый тип. Кроме того, если в вашем возвращаемом типе используется тип 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
{
}
Определения типов членов не попадают в область видимости до тех пор, пока имя класса не появится раньше ::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
аргументов.