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.
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.
En clair, cela indique que le type de retour est le type inféré de la somme de a
et b
.