Considérez la fonction suivante :
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
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'});
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'})
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
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!