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) { ... };


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow