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

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