Maison > Article > développement back-end > Pourquoi les paramètres de type de modèle ne peuvent-ils pas être déduits des arguments de fonction par défaut en C ?
Pourquoi les paramètres de type de modèle ne peuvent pas être déduits des arguments de fonction par défaut
En C, une idée fausse courante est que le compilateur peut déduire les paramètres de type de modèle à partir des arguments de fonction par défaut. Cependant, ce n'est pas le cas.
Lorsqu'il rencontre le code suivant :
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); // Error: could not deduce template argument for T }</code>
le compilateur ne parvient pas à déduire le type T de l'argument par défaut 0.0f. Au lieu de cela, il nécessite une spécification explicite, comme dans a.bar
Interdiction C 03
En C 03, la spécification du langage interdit explicitement l'utilisation Arguments de fonction par défaut pour la déduction des arguments de modèle (C 03 §14.8.2/17) :
A template type-parameter cannot be deduced from the type of a function default argument.
Arguments de modèle par défaut C 11
En C 11, une solution de contournement a émergé : introduction des arguments de modèle par défaut. En modifiant le code comme suit :
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
le paramètre de modèle par défaut T est fourni. Cependant, il convient de noter qu'avoir un argument de modèle par défaut n'allège pas la restriction sur les arguments de fonction par défaut.
Selon C 11 14.8.2.5/5, les arguments de fonction par défaut sont considérés comme des « contextes non déduits » dans le processus de déduction des arguments du modèle. Cela signifie que le compilateur ne peut pas utiliser la valeur par défaut de l'argument de fonction pour déduire le paramètre de type de modèle.
Conclusion
Bien que les arguments de fonction par défaut soient pratiques, les paramètres de type de modèle il ne faut pas en déduire. Dans les cas où les valeurs par défaut sont nécessaires, les arguments de modèle par défaut offrent une solution plus portable et plus flexible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!