In bestimmten Fällen müssen Sie einen nachgestellten Rückgabetyp verwenden. Insbesondere muss ein Lambda-Rückgabetyp, falls angegeben, über einen nachfolgenden Rückgabetyp angegeben werden. Wenn Ihr Rückgabetyp ein verwendet decltype
, für das die Argumentnamen im Gültigkeitsbereich liegen müssen, muss ein nachfolgender Rückgabetyp verwendet werden (normalerweise kann man declval<T>
dieses letztere Problem jedoch umgehen).
Der nachfolgende Rückgabetyp hat einige andere geringfügige Vorteile. Betrachten Sie beispielsweise eine Nicht-Inline-Elementfunktionsdefinition unter Verwendung der traditionellen Funktionssyntax:
struct my_awesome_type
{
typedef std::vector<int> integer_sequence;
integer_sequence get_integers() const;
};
my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
// ...
}
Die Typedefs der Mitglieder sind erst im Geltungsbereich, nachdem der Name der Klasse zuvor angezeigt wurde. Daher ::get_integers
müssen wir die Klassenqualifikation zweimal wiederholen. Wenn wir einen nachgestellten Rückgabetyp verwenden, müssen wir den Namen des Typs nicht wiederholen:
auto my_awesome_type::get_integers() const -> integer_sequence
{
// ...
}
In diesem Beispiel ist das keine große Sache, aber wenn Sie lange Klassennamen oder Elementfunktionen von Klassenvorlagen haben, die nicht inline definiert sind, kann dies einen großen Unterschied in der Lesbarkeit bewirken.
In seiner "Fresh Paint" -Sitzung bei C ++ Now 2012 wies Alisdair Meredith darauf hin, dass die Namen aller Ihrer Funktionen genau übereinstimmen, wenn Sie nachfolgende Rückgabetypen konsistent verwenden:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Ich habe überall in CxxReflect nachgestellte Rückgabetypen verwendet. Wenn Sie also nach einem Beispiel suchen, wie Code mit ihnen konsistent aussieht, können Sie dort einen Blick darauf werfen (z. B. die type
Klasse ).
decltype
Argumente da.