末尾の戻り値の型を使用しなければならない場合があります。特に、ラムダの戻り値の型を指定する場合は、末尾の戻り値の型を介して指定する必要があります。また、戻り値の型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
{
}
メンバーtypedefは、クラスの名前が前::get_integers
に表示されるまでスコープ内にないため、クラスの修飾を2回繰り返す必要があります。末尾の戻り値の型を使用する場合、型の名前を繰り返す必要はありません。
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
この例では、それほど大きな問題ではありませんが、インラインで定義されていない長いクラス名またはクラステンプレートのメンバー関数がある場合、読みやすさに大きな違いが生じる可能性があります。
彼には「新鮮なペイント」:C ++今2012でのセッション、Alisdairメレディスは、あなたが一貫して後続の戻り値の型を使用している場合、あなたのすべての機能の名前がきちんと並んでいることを指摘しました
auto foo() -> int;
auto bar() -> really_long_typedef_name;
私はどこにでも戻り値の型を末尾に使用しましたCxxReflectあなたは、コードの見た目が一貫して使用方法の例を探しているそうだとすれば、あなたは見てそこに(例えば、取ることができますクラス)。type
decltype
に議論のためにあります。