Maison > développement back-end > C++ > Pourquoi la déduction du type de modèle échoue-t-elle avec « initializer_list » dans cet exemple ?

Pourquoi la déduction du type de modèle échoue-t-elle avec « initializer_list » dans cet exemple ?

Susan Sarandon
Libérer: 2024-11-28 18:47:11
original
682 Les gens l'ont consulté

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

Déduction de type de modèle avec initializer_list

Considérez la fonction suivante :

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

La fonction ci-dessus attend un seul paramètre avec les fonctions membres start() et end(). Il existe plusieurs façons d'appeler cette fonction avec différents types de données. Par exemple, nous pouvons utiliser un std::vector, un std::string, un std::array, ou même une liste d'initialisation. Cependant, il existe un cas particulier qui est illégal :

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

Cette ligne de code entraînera une erreur de compilation. Pourquoi est-ce le cas ?

Échec de la déduction des arguments du modèle

La déduction de type pour les arguments du modèle ne peut réussir que si les types de paramètres de fonction correspondent aux types d'arguments fournis. Dans le cas de la fonction printme :

  • Les arguments std::vector, std::string et std::array ont tous des types bien définis qui correspondent au type de paramètre de la fonction (par exemple, std::vector).
  • L'argument de la liste d'initialisation ({'a', 'b', 'c'}) n'a pas un type bien défini. Il s'agit d'un objet temporaire qui n'est pas associé à un type spécifique.
  • Par conséquent, le compilateur est incapable de déduire l'argument du modèle T dans le cas de l'argument de la liste d'initialisation. La spécification explicite de l'argument du modèle résoudra le problème (par exemple, printme>({'a', 'b', 'c'})).

    Cas particulier pour auto

    Bien que l'argument de la liste d'initialisation soit illégal dans la fonction printme, il est valide d'utiliser auto pour initialiser une variable contenant une liste d'initialisation. En effet, auto déduira le type de il comme std::initializer_list, permettant au compilateur de déduire l'argument du modèle dans printme(il).

    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