Maison >développement back-end >C++ >Pourquoi la déduction du type de modèle échoue-t-elle avec « initializer_list » dans cet exemple ?
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 :
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
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
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!