Controverse sur l'inférence de modèle de constructeur de classe
Les paramètres de modèle peuvent être facilement déduits des arguments de fonction, comme dans le code suivant :
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
Cependant, une approche similaire n'est pas autorisée pour les constructeurs de classes, ce qui a soulevé des questions parmi les programmeurs C. Pourquoi pas ?
La raison de cette incohérence réside dans la complexité de la construction des objets. Les constructeurs ne sont pas le seul point d’entrée d’une classe. Les constructeurs de copie et les opérateurs d'affectation jouent également un rôle essentiel, et déduire les paramètres de modèle uniquement à partir du constructeur pourrait conduire à des ambiguïtés.
Considérez l'exemple suivant :
template <typename T> class Variable { T data; public: Variable(T d) { data = d; } };
Si l'inférence de modèle était autorisée, le le code suivant serait valide :
Variable var(2); // Equivalent to Variable<int> var(2);
Mais que se passerait-il si nous utilisions la construction ou l'affectation par copie opérateurs ?
MyClass m(string s); MyClass *pm; *pm = m;
Dans ce cas, il serait difficile pour le compilateur de déterminer le type de modèle de MyClass pm.
Pour atténuer ce problème, C 17 a introduit la déduction de type à partir des arguments du constructeur . Cela permet de déduire les paramètres du modèle à partir des paramètres du constructeur, éliminant ainsi le besoin d'arguments de type explicites dans certaines situations. Par exemple :
std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5); std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
Il est important de noter que cette fonctionnalité d'inférence est toujours en cours de développement et pourrait être sujette à des modifications dans les futurs standards C. Néanmoins, cela marque une étape importante vers la simplification du code et l’amélioration de la sécurité des types.
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!