C++
Type de retour
Recherche…
Syntaxe
- nom_fonction ([ noeuds_fonction ]) [ attributs_fonction ] [ qualificateurs_fonctionnels ]
->
type-retour-fin [ clause_exigences ]
Remarques
La syntaxe ci-dessus montre une déclaration de fonction complète en utilisant un type de fin, où les crochets indiquent une partie facultative de la déclaration de fonction (comme la liste d'arguments si une fonction non-arg).
En outre, la syntaxe du type de retour final interdit de définir une classe, une union ou un type enum dans un type de retour de fin (notez que cela n'est pas autorisé non plus dans un type de retour principal). En dehors de cela, les types peuvent être épelés de la même manière après le ->
qu'ils seraient ailleurs.
Évitez de qualifier un nom de type imbriqué
class ClassWithAReallyLongName {
public:
class Iterator { /* ... */ };
Iterator end();
};
Définition de la end
du membre avec un type de retour de fin:
auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }
Définition de la end
du membre sans type de retour de fin:
ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }
Le type de retour final est recherché dans la portée de la classe, tandis qu'un type de retour principal est recherché dans la portée de l'espace de nommage et peut donc nécessiter une qualification "redondante".
Expressions lambda
Un lambda ne peut avoir qu'un type de retour final; la syntaxe du type de retour principal n'est pas applicable à lambdas. Notez que dans de nombreux cas, il n'est pas nécessaire de spécifier un type de retour pour un lambda.
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) { ... };