Déduction d'arguments de modèle pour les modèles de classe : limites et implications
À la suite de la proposition P0091 visant à unifier le comportement de déduction d'arguments de modèle pour la fonction et modèles de classe, une question se pose : pourquoi la déduction partielle des arguments des modèles de classe n'est-elle pas possible ?
La proposition initiale visait à aligner les mécanismes de déduction, permettant une déduction partielle dans les deux contextes. Cependant, des inquiétudes ont émergé concernant une confusion potentielle lorsque les valeurs déduites produisent plusieurs spécialisations de modèles valides. Un exemple classique est la déduction d'un type de tuple : en spécifiant un seul argument, le compilateur pourrait déduire un tuple avec un seul élément, même si la définition originale du tuple inclut plusieurs éléments.
Pour éviter une telle ambiguïté, partielle La déduction des arguments du modèle de classe a été supprimée de la proposition. Cette limitation affecte les scénarios dans lesquels les développeurs peuvent souhaiter spécifier explicitement certains paramètres de modèle tout en laissant d'autres à déduire.
Par exemple, considérons le modèle de classe suivant :
template <std::size_t S, typename T> struct test { static constexpr auto size = S; using type_t = T; test(type_t (&input)[size]) : data(input) {} type_t (&data)[size]{}; };
Une fonction d'assistance sert de un sucre syntaxique pour instancier des objets de test :
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
Lors de l'utilisation de l'assistant avec un tableau pré-déclaré :
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced auto c = helper(buffer); // Type and size deduced
La déduction partielle n'est pas prise en charge dans le cas des modèles de classe, car en témoigne l'échec de auto b = helper<5>(buffer);. Le compilateur ne peut pas déduire le paramètre T de l'argument, ce qui entraîne une erreur de compilation. Au lieu de cela, auto c = helper(buffer); déduit avec succès S et T, démontrant la nécessité de spécifier explicitement tous les paramètres du modèle.
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!