Maison > développement back-end > C++ > Pourquoi C n'autorise-t-il pas l'inférence de paramètres de modèle pour les constructeurs ?

Pourquoi C n'autorise-t-il pas l'inférence de paramètres de modèle pour les constructeurs ?

DDD
Libérer: 2024-12-07 01:46:12
original
885 Les gens l'ont consulté

Why Doesn't C   Allow Template Parameter Inference for Constructors?

Inférence des paramètres de modèle à partir des constructeurs

Le langage C permet l'inférence des paramètres de modèle à partir des paramètres de fonction, mais pas à partir des constructeurs de classe. Cela peut soulever la question : pourquoi ne pas autoriser cette inférence pour les constructeurs ?

L'une des raisons pour lesquelles l'inférence de modèle n'est pas autorisée pour les constructeurs est que les constructeurs ne sont pas le seul point d'entrée pour une classe. Les constructeurs de copie et les opérateurs d'affectation fournissent des moyens supplémentaires pour créer des objets d'une classe. Autoriser l'inférence de modèle pour les constructeurs nécessiterait que le compilateur prenne en compte tous ces points d'entrée lors de la détermination des paramètres du modèle, ce qui pourrait conduire à une ambiguïté syntaxique.

class MyClass {
    int a;
    int b;

public:
    MyClass(int a, int b): a(a), b(b) {}
};
Copier après la connexion

Dans cet exemple, si l'inférence de modèle était autorisée pour les constructeurs, il ne serait pas clair quels paramètres de modèle doivent être utilisés lors de la création d'un objet MyClass à l'aide du constructeur de copie ou de l'opérateur d'affectation.

Une autre raison pour laquelle l'inférence de modèle n'est pas autorisée pour les constructeurs est que cela pourrait conduire à un comportement inattendu. Considérez le code suivant :

class MyContainer {
    std::vector<T> vec;
};

int main() {
    MyContainer<int> container; // explicitly specify template parameter
    MyContainer container2(vec); // infer template parameter from constructor
}
Copier après la connexion

Dans cet exemple, la classe MyContainer peut être construite avec soit un paramètre de modèle explicitement spécifié, soit un vecteur d'un type spécifique. Si l'inférence de modèle était autorisée pour les constructeurs, la deuxième ligne de code créerait un MyContainer de type T. Cependant, ce n'est peut-être pas le comportement prévu, car l'utilisateur a peut-être voulu créer un MyContainer de type int.

En raison de ces problèmes, l'inférence de modèle n'est pas autorisée pour les constructeurs de classe. Cependant, en C 17, une spécialisation partielle des modèles peut être utilisée pour obtenir un effet similaire. La spécialisation partielle du modèle permet à l'utilisateur de spécifier les paramètres du modèle pour un type spécifique, tout en laissant d'autres paramètres du modèle être déduits.

template <typename T>
class MyContainer {
    std::vector<T> vec;
};

template <>
class MyContainer<int> {
    std::vector<int> vec;
};

int main() {
    MyContainer container; // infer template parameter to 'int'
    MyContainer<double> container2; // explicitly specify template parameter
}
Copier après la connexion

Dans cet exemple, la classe MyContainer a une spécialisation partielle du modèle pour int. Cela signifie que lorsqu'un MyContainer est créé avec un type int, le paramètre de modèle sera automatiquement déduit qu'il s'agit d'un int. Pour les autres types, le paramètre de modèle doit être explicitement spécifié.

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