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_type
Ils 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:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
et le compilateur vous dira qu'il ne sait pas quoi a
et b
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:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
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
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
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.