Maison > développement back-end > C++ > Pourquoi `printme({\'a\', \'b\', \'c\'});` est-il illégal dans la déduction de type de modèle C ?

Pourquoi `printme({\'a\', \'b\', \'c\'});` est-il illégal dans la déduction de type de modèle C ?

Patricia Arquette
Libérer: 2024-12-02 20:24:14
original
480 Les gens l'ont consulté

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

Déduction de type dans les fonctions avec listes d'initialisation

Considérez le modèle de fonction :

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}
Copier après la connexion

Cette fonction attend un paramètre d'un type avec un début () et fin() fonction.

Question :

Pourquoi l'appel suivant est-il illégal ?

printme({'a', 'b', 'c'});
Copier après la connexion

Réponse :

L'appel printme({'a', 'b', 'c'}) est illégal car l'argument du modèle T ne peut pas être déduit. Sans spécifier explicitement l'argument du modèle, le compilateur ne peut pas déterminer le type du paramètre, car il peut s'agir de n'importe quel type avec une fonction start() et end(). Ce problème ne se pose pas dans les cas suivants :

  • Spécification explicite de l'argument du modèle : printme>({'a', 'b', 'c'})
  • Types de paramètres avec déduction de type : printme(std::vector({'a', 'b', 'c'}))
  • Utiliser auto pour déduire le type : const auto il = {'a', 'b', 'c'}; printme(il);
  • Spécifier explicitement l'argument du modèle : printme>({'a', 'b', 'c'})
  • L'exception à ceci est la déduction de auto comme std::initializer_list, qui diffère du modèle déduction des arguments. Ce comportement est explicitement spécifié dans la norme C 11 (§ 14.8.2.5/5), qui stipule que l'argument modèle pour un paramètre de fonction qui est une liste d'initialisation mais pas de type std::initializer_list n'est pas déduit. Cependant, le § 7.1.6.4/6 de la norme fournit une prise en charge explicite de la déduction automatique de std::initializer_list<>.

    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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal