Suche…


Syntax

  • Funktionsname ([ Funktionszeichen ]) [ Funktionsattribute ] [ Funktionsqualifizierer ] -> Nachlauf-Rückgabetyp [ Requires_clause ]

Bemerkungen

Die obige Syntax zeigt eine vollständige Funktionsdeklaration mit einem abschließenden Typ, wobei eckige Klammern einen optionalen Teil der Funktionsdeklaration angeben (wie die Argumentliste, wenn eine no-arg-Funktion verwendet wird).

Außerdem verhindert die Syntax des nachgestellten Rückgabetyps das Definieren eines Klassen-, Union- oder Enummentyps innerhalb eines nachlaufenden Rückgabetyps (beachten Sie, dass dies auch in einem führenden Rückgabetyp nicht zulässig ist). Ansonsten können Typen nach dem -> die gleiche Weise buchstabiert werden wie an anderen Stellen.

Vermeiden Sie die Qualifizierung eines verschachtelten Typnamens

class ClassWithAReallyLongName {
  public:
    class Iterator { /* ... */ };
    Iterator end();
};

Definieren des Member- end mit einem nachgestellten Rückgabetyp:

auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }

Definieren des Member- end ohne nachgestellten Rückgabetyp:

ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }

Der nachfolgende Rückgabetyp wird im Gültigkeitsbereich der Klasse gesucht, während ein führender Rückgabetyp im umschließenden Namespace-Bereich gesucht wird und daher eine "redundante" Qualifizierung erfordern kann.

Lambda-Ausdrücke

Ein Lambda kann nur eine nachlaufende Rückgabe haben. Die führende Rückgabewert-Syntax gilt nicht für Lambdas. Beachten Sie, dass es in vielen Fällen nicht erforderlich ist, für ein Lambda überhaupt einen Rückgabetyp anzugeben.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow