Récemment, j'ai été travailler à un ami qui voulait faire du C++ plus Haskell-y, et nous voulions une fonction qui est en gros comme ceci:
auto sum(auto a, auto b) {
return a + b;
}
Apparemment je ne peux pas utiliser l'auto comme un type de paramètre, alors je l'ai changé à cela:
template<class A, class B>
auto sum(A a, B b) {
return a + b;
}
Mais cela ne fonctionne pas non plus. Ce que nous avons finalement réalisé que nous avons besoin de ceci:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b) {
return a + b;
}
Donc ma question est, quel est le point? N'est-ce pas decltype
il suffit de répéter l'information, puisque le compilateur peut-il suffit de regarder l'instruction de retour?
J'ai pensé que peut-être c'est nécessaire afin que nous puissions simplement inclure un fichier d'en-tête:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b);
... mais nous ne pouvons pas utiliser des modèles comme ça de toute façon.
L'autre chose que j'ai considéré est qu'il pourrait être plus facile pour le compilateur, mais il me semble qu'il serait plus difficile.
Cas 1: Avec decltype
- Déterminer le type de l'
decltype
déclaration - Comprendre les types de toutes les valeurs de retour
- Voir si elles correspondent
Cas 2: Sans decltype
- Comprendre les types de toutes les valeurs de retour
- Voir si elles correspondent
Donc, avec ces choses à l'esprit, ce qui est le point de fuite type de retour avec decltype
?