Maison > développement back-end > C++ > Pourquoi les paramètres du modèle C ne peuvent-ils pas être déduits pour les constructeurs de classe comme les modèles de fonction ?

Pourquoi les paramètres du modèle C ne peuvent-ils pas être déduits pour les constructeurs de classe comme les modèles de fonction ?

DDD
Libérer: 2024-12-08 17:44:12
original
197 Les gens l'ont consulté

Why Can't C   Template Parameters Be Inferred for Class Constructors Like Function Templates?

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;
}
Copier après la connexion

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; }
};
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion

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);
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal