Il existe certains cas où vous devez utiliser un type de retour de fin. Plus particulièrement, un type de retour lambda, s'il est spécifié, doit être spécifié via un type de retour de fin. En outre, si votre type de retour utilise un decltype
qui nécessite que les noms d'argument soient dans la portée, un type de retour de fin doit être utilisé (cependant, on peut généralement l'utiliser declval<T>
pour contourner ce dernier problème).
Le type de retour de fin présente d'autres avantages mineurs. Par exemple, considérons une définition de fonction membre non en ligne utilisant la syntaxe de fonction traditionnelle:
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
{
}
Les typedefs de membres ne sont dans la portée qu'après l'apparition du nom de la classe ::get_integers
, nous devons donc répéter la qualification de classe deux fois. Si nous utilisons un type de retour de fin, nous n'avons pas besoin de répéter le nom du type:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
Dans cet exemple, ce n'est pas si grave, mais si vous avez des noms de classe longs ou des fonctions membres de modèles de classe qui ne sont pas définis en ligne, cela peut faire une grande différence en termes de lisibilité.
Dans sa session "Fresh Paint" à C ++ Now 2012, Alisdair Meredith a souligné que si vous utilisez les types de retour de fin de manière cohérente, les noms de toutes vos fonctions s'alignent parfaitement:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
J'ai utilisé des types de retour de fin partout dans CxxReflect , donc si vous cherchez un exemple de l'apparence du code en les utilisant de manière cohérente, vous pouvez y jeter un œil (par exemple, la type
classe ).
decltype
les arguments.