web-dev-qa-db-fra.com

opérateur de flèche (->) dans l'en-tête de la fonction

J'ai trouvé ce code:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

J'ai figuré avec tous les détails, ce qui était nouveau pour moi, sauf un. Dites-moi s'il vous plaît, où puis-je lire, qu'est-ce que l'opérateur de flèche (->) signifie en en-tête de fonction? Je suppose que purement logique, que -> L’opérateur détermine un type, qui sera obtenu par auto, mais je veux comprendre, mais je ne trouve pas d’information.

105
user1234567

En C++ 11, il existe deux syntaxes pour la déclaration de fonction:

type de retour identificateur ( arguments-déclarations ... )

et

auto identifiant ( arguments-déclarations ... )-> type_de_retour

Ils sont équivalents. Maintenant, quand ils sont équivalents, pourquoi voulez-vous jamais utiliser ce dernier? Eh bien, C++ 11 a introduit cette chose intéressante decltype qui vous permet de décrire le type d’une expression. Donc, vous voudrez peut-être dériver le type de retour des types d'argument. Alors vous essayez:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

et le compilateur vous dira qu'il ne sait pas ce que a et b sont dans l'argument decltype. C'est parce qu'ils ne sont déclarés que par la liste d'arguments.

Vous pouvez facilement contourner le problème en utilisant declval et les paramètres de modèle déjà déclarés. Comme:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

sauf que ça devient vraiment verbeux maintenant. Donc, la syntaxe de déclaration alternative a été proposée et implémentée et maintenant vous pouvez écrire

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

et c'est moins bavard et les règles de cadrage n'ont pas besoin de changer.


Mise à jour C++ 14: C++ 14 permet également

auto identifiant ( arguments-déclarations ... )

tant que la fonction est entièrement définie avant utilisation et que toutes les instructions return sont déduites du même type. Le -> La syntaxe reste utile pour les fonctions publiques (déclarées dans l'en-tête) si vous souhaitez masquer le corps dans le fichier source. Il est évident que cela ne peut pas être fait avec des modèles, mais il existe certains types concrets (généralement dérivés de la métaprogrammation des modèles) qui sont difficiles à écrire autrement.

165
Jan Hudec

En clair, cela indique que le type de retour est le type inféré de la somme de a et b.

17
murrekatt