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) { ... };


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow