末尾の戻り値の型を使用する必要がある特定のケースがあります。特に、ラムダの戻り値の型を指定する場合は、末尾の戻り値の型を介して指定する必要があります。また、戻り値の型decltype
が引数名がスコープ内にあることを必要とする a を使用する場合は、末尾の戻り値の型を使用する必要があります (ただし、通常、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
{
// ...
}
メンバーの typedef は、クラスの名前が の前::get_integers
に表示されるまでスコープに含まれないため、クラス修飾を 2 回繰り返す必要があります。末尾の戻り型を使用する場合、型の名前を繰り返す必要はありません。
auto my_awesome_type::get_integers() const -> integer_sequence
{
// ...
}
この例ではそれほど大きな問題ではありませんが、インラインで定義されていない長いクラス名またはクラス テンプレートのメンバー関数がある場合、読みやすさに大きな違いが生じる可能性があります。
Alisdair Meredith は、C++Now 2012 での「Fresh Paint」セッションで、末尾の戻り値の型を一貫して使用すると、すべての関数の名前が整然と並んでいると指摘しました。
auto foo() -> int;
auto bar() -> really_long_typedef_name;
私はCxxReflectのいたるところで末尾の戻り値の型を使用してきました。コードがそれらを一貫して使用してどのように見えるかの例を探している場合は、そこ (例: class type
)を参照してください。