C++
Końcowy typ zwrotu
Szukaj…
Składnia
- function_name ([function_args]) [function_attributes] [function_qualifiers]
->
końcowe zwrotny typu [requires_clause]
Uwagi
Powyższa składnia pokazuje pełną deklarację funkcji przy użyciu typu końcowego, gdzie nawiasy kwadratowe wskazują opcjonalną część deklaracji funkcji (podobnie jak lista argumentów, jeśli funkcja no-arg).
Ponadto składnia końcowego typu powrotu uniemożliwia zdefiniowanie typu klasy, unii lub typu wyliczeniowego wewnątrz końcowego typu powrotu (pamiętaj, że nie jest to dozwolone w wiodącym typie powrotu). Poza tym typy można przeliterować w taki sam sposób po ->
jak w innym miejscu.
Unikaj kwalifikowania nazwy typu zagnieżdżonego
class ClassWithAReallyLongName {
public:
class Iterator { /* ... */ };
Iterator end();
};
Definiowanie end
członka za pomocą końcowego typu powrotu:
auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }
Definiowanie end
członka bez końcowego typu powrotu:
ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }
Końcowy typ zwracany jest sprawdzany w zakresie klasy, podczas gdy wiodący typ zwracany jest sprawdzany w obejmującym zakresie przestrzeni nazw i dlatego może wymagać kwalifikacji „nadmiarowej”.
Wyrażenia lambda
Lambda może mieć tylko końcowy typ powrotu; wiodąca składnia typu zwracanego nie ma zastosowania do lambdas. Zauważ, że w wielu przypadkach w ogóle nie jest konieczne podawanie typu zwracanego dla lambda.
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) { ... };