Maison >développement back-end >C++ >Pourquoi C ne peut-il pas déduire les arguments de modèle à partir des arguments de fonction par défaut ?

Pourquoi C ne peut-il pas déduire les arguments de modèle à partir des arguments de fonction par défaut ?

DDD
DDDoriginal
2024-11-05 09:14:021001parcourir

Why Can't C   Deduce Template Arguments from Default Function Arguments?

Déduction d'arguments de modèle à partir des arguments de fonction par défaut

En C, les programmeurs rencontrent souvent des scénarios dans lesquels ils doivent déduire des arguments de modèle à partir d'appels de fonction. Cependant, il peut y avoir des cas où cette déduction échoue, entraînant des erreurs du compilateur. Un tel cas est l'incapacité de déduire les paramètres de type de modèle à partir des arguments de fonction par défaut.

Considérez l'extrait de 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);
}</code>

Lors de la compilation de ce code, le compilateur peut générer une erreur indiquant : "Impossible de déduire l'argument modèle pour T." Pour résoudre ce problème, il faut spécifier explicitement l'argument du modèle dans l'appel de fonction, tel que a.bar(5). Mais pourquoi le compilateur ne parvient-il pas à déduire le type en premier lieu ?

En C 03, les spécifications du langage interdisent explicitement l'utilisation d'arguments par défaut pour déduire les arguments du modèle. Selon C 03 §14.8.2/17, "Un paramètre de type de modèle ne peut pas être déduit du type d'un argument par défaut de fonction."

En C 11, le langage a introduit une nouvelle fonctionnalité qui permet de fournir des valeurs par défaut arguments de modèle pour les modèles de fonctions :

<code class="cpp">template <typename T = float>
void bar(int a, T b = 0.0f) { }</code>

Cependant, l'argument de modèle par défaut est obligatoire. S'il n'est pas fourni, le compilateur interdit toujours l'utilisation de l'argument de fonction par défaut pour la déduction des arguments de modèle. C 11 §14.8.2.5/5 stipule que :

"Un paramètre de modèle utilisé dans le type de paramètre d'un paramètre de fonction qui a un argument par défaut qui est utilisé dans l'appel pour lequel la déduction d'argument est effectuée" est un contexte non déduit.

En résumé, bien que fournir des arguments par défaut pour les paramètres de fonction puisse simplifier le code, il est essentiel de comprendre les limites de la déduction des arguments de modèle dans de tels cas. Les arguments par défaut ne peuvent être utilisés pour la déduction des arguments de modèle que si un argument de modèle par défaut est explicitement fourni.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn