サーチ…
構文
- function_name ([ function_args ])[ function_attributes ] [ function_qualifiers ]
->
trailing-return-type [ requires_clause ]
備考
上の構文は、関数の宣言のオプション部分を示す角括弧(引数なしの関数の場合は引数リストのように)を使用して、末尾型を使用した完全な関数宣言を示しています。
さらに、末尾の戻り値の型の構文は、後続の戻り値の型の中でクラス、共用体、または列挙型を定義することを禁じます(先頭の戻り値の型では許可されません)。それ以外の場合は、 ->
後に同じように型を綴ることができます。
ネストされた型名の修飾を避ける
class ClassWithAReallyLongName {
public:
class Iterator { /* ... */ };
Iterator end();
};
末尾の戻り値の型でメンバend
を定義する:
auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }
末尾の戻り値の型を持たないメンバend
を定義する:
ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }
末尾の戻り値の型は、クラスのスコープ内で参照されますが、先行する戻り値の型は、囲む名前空間のスコープ内で検索され、したがって、「冗長」な修飾を必要とする可能性があります。
ラムダ式
ラムダは後続の戻り値型しか持てません。先頭のリターン型構文はラムダには適用されません。多くの場合、ラムダの戻り値の型をまったく指定する必要はないことに注意してください。
struct Base {};
struct Derived1 : Base {};
struct Derived2 : Base {};
auto lambda = [](bool b) -> Base* { if (b) return new Derived1; else return new Derived2; };
// ill-formed: auto lambda = Base* [](bool b) { ... };
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow