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!