Istnieją pewne przypadki, w których należy użyć końcowego typu zwracanego. Przede wszystkim zwracany typ lambda, jeśli został określony, musi być określony za pośrednictwem końcowego typu zwracanego. Ponadto, jeśli typ zwracany wykorzystuje a, decltype
który wymaga, aby nazwy argumentów znajdowały się w zakresie, należy użyć końcowego typu zwracanego (jednak zwykle można go użyć declval<T>
do obejścia tego ostatniego problemu).
Końcowy zwracany typ ma inne drobne zalety. Rozważmy na przykład definicję funkcji składowej innej niż wbudowana, używając tradycyjnej składni funkcji:
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
{
}
Typy elementów członkowskich znajdują się w zakresie dopiero po pojawieniu się nazwy klasy przed ::get_integers
, więc musimy dwukrotnie powtórzyć kwalifikację klasy. Jeśli używamy końcowego typu zwracanego, nie musimy powtarzać nazwy typu:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
W tym przykładzie nie jest to taka wielka sprawa, ale jeśli masz długie nazwy klas lub funkcje składowe szablonów klas, które nie są zdefiniowane w tekście, może to mieć duży wpływ na czytelność.
W swojej sesji „Fresh Paint” w C ++ Now 2012 Alisdair Meredith zwrócił uwagę, że jeśli konsekwentnie używasz końcowych typów zwracanych, nazwy wszystkich funkcji są dobrze dopasowane:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Użyłem końcowych typów zwracanych wszędzie w CxxReflect , więc jeśli szukasz przykładu, jak kod wygląda konsekwentnie przy ich użyciu, możesz tam zajrzeć (np . type
Klasa ).
decltype
kłótni.