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
Susan Sarandonoriginal
2024-11-28 18:47:11683parcourir

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;
}

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'});

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!

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