C++
Hinterlegter Rückgabetyp
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) { ... };