Maison > développement back-end > C++ > Pourquoi la déduction de modèle échoue-t-elle avec les listes d'initialisation en C ?

Pourquoi la déduction de modèle échoue-t-elle avec les listes d'initialisation en C ?

Mary-Kate Olsen
Libérer: 2024-11-29 16:39:09
original
726 Les gens l'ont consulté

Why Does Template Deduction Fail with Initializer Lists in C  ?

Listes de déduction et d'initialisation de modèles

Considérez la fonction suivante :

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

Cette fonction prend un seul paramètre avec un début()/fin () type activé. Cependant, l'extrait de code suivant est considéré comme illégal :

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

Malgré un code similaire qui utilise des vecteurs, des chaînes, des tableaux et des listes d'initialisation explicites fonctionnant sans problème. La question se pose : pourquoi cet extrait spécifique est-il illégal ?

La clé pour comprendre ce problème réside dans la déduction des arguments du modèle. Dans ce cas, l’argument modèle T ne peut pas être déduit. Pour rectifier cela, il faut spécifier explicitement l'argument template, comme vu ci-dessous :

printme<vector<char>>({'a', 'b', 'c'})
printme<initializer_list<char>>({'a', 'b', 'c'})
Copier après la connexion

Dans les extraits susmentionnés où le code est légal, l'argument possède un type bien défini, permettant l'argument template T être déduit de manière transparente. L'utilisation de auto permet également à la fonction de fonctionner, car elle déduit que le type est std::initializer_list.

Cependant, un comportement particulier apparaît lors de la comparaison de la déduction de l'argument du modèle et du mot-clé auto. Alors que auto déduit que le type est std::initializer_list, ce n'est pas le cas de la déduction de l'argument du modèle. En effet, la norme C 11 indique explicitement qu'il s'agit d'un contexte non déduit pour un argument de modèle lorsque le paramètre de fonction est une liste d'initialisation, mais que le paramètre n'a pas std :: initializer_list ou une référence à un std éventuellement qualifié par cv. ::initializer_list type.

Néanmoins, le mot-clé auto prend spécifiquement en charge std::initializer_list<>, permettant au code de fonctionner correctement.

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