Je suis tombé sur le code suivant:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Il y a une chose que je ne comprends pas:
Où pourrais-je trouver ce que signifie l'opérateur flèche ( ->
) dans l'en-tête de fonction? Je suppose que de manière purement logique, l' ->
opérateur détermine un type auquel auto
il sera déduit, mais je veux clarifier les choses. Je ne trouve aucune information.
Réponses:
En C ++ 11, il existe deux syntaxes pour la déclaration de fonction:
déclarations d' arguments d' identificateur de type de retour
(
...)
et
auto
identifiant(
argument-déclarations ...)
->
return_typeIls sont équivalents. Maintenant, quand ils sont équivalents, pourquoi avez-vous jamais envie d'utiliser ce dernier? Eh bien, C ++ 11 a introduit cette
decltype
chose intéressante qui vous permet de décrire le type d'une expression. Vous souhaiterez peut-être dériver le type de retour à partir des types d'argument. Alors vous essayez:et le compilateur vous dira qu'il ne sait pas quoi
a
etb
sont dans l'decltype
argument. En effet, 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 qui sont déjà déclarés. Comme:sauf que ça devient vraiment bavard maintenant. Ainsi, la syntaxe de déclaration alternative a été proposée et implémentée et vous pouvez maintenant écrire
et c'est moins verbeux et les règles de cadrage n'ont pas besoin de changer.
Mise à jour C ++ 14: C ++ 14 permet également
auto
identifiant(
argument-déclarations ...)
tant que la fonction est entièrement définie avant utilisation et que toutes les
return
instructions sont du même type. 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. De toute évidence, cela ne peut pas être fait avec des modèles, mais il existe des types concrets (généralement dérivés via la métaprogrammation de modèles) qui sont difficiles à écrire autrement.la source
C++14
lorsque j'utiliseauto
pourreturn
taper dans une telle fonction sans avoir besoin de la-> decltype(a + b)
pièce. Est-il redondant maintenant ou y a-t-il d'autres cas où il devrait encore être utilisé? ou est-ce une extension spécifique au compilateur?auto
, sans la->
notation, tant que la fonction est entièrement définie avant utilisation et que toutes lesreturn
instructions sont déduites du même type. La->
notation est toujours utile si vous souhaitez utiliser la déduction pour une fonction publique tout en masquant le corps dans le fichier source.En clair, il indique que le type de retour est le type inféré de la somme de
a
etb
.la source