Maison >développement back-end >C++ >Pourquoi les modèles C ne peuvent-ils pas utiliser des types incomplets ?
Pourquoi C interdit-il les modèles avec des types incomplets ?
Les conteneurs C, tels que ceux de la bibliothèque C standard, n'autorisent pas les types incomplets comme paramètres de modèle. Cette restriction découle de raisons historiques.
Raison d'être historique
Au départ, on pensait que les conteneurs pouvaient prendre en charge des types incomplets. Cependant, les tests ont révélé des incohérences entre les implémentations STL. Le comité de normalisation a ainsi déclaré un comportement indéfini pour les conteneurs STL de fonctionner avec des types incomplets, étendant cette interdiction à l'ensemble de la bibliothèque standard.
Cette décision visait à empêcher l'invalidation des implémentations de bibliothèques existantes en les obligeant à prendre en charge les types incomplets. rétroactivement.
Comprendre l'interdiction
La préoccupation du comité découlait du potentiel de comportement indéfini et nécessité de maintenir une compatibilité ascendante. Les types incomplets dans les modèles introduisent des incertitudes concernant la gestion de la mémoire et la stabilité du code.
Considérations futures
Malgré l'interdiction actuelle, Matt Austern, président du groupe de travail de la bibliothèque C, a prédit que les futures révisions du C pourraient assouplir la restriction sur les types incomplets. Cela pourrait refléter une évolution progressive vers une prise en charge accrue des types incomplets, comme le prévoit la norme C 17 pour certains conteneurs.
Approche alternative
En raison de l'interdiction continue de la norme , les concepteurs de la bibliothèque Boost ont choisi de créer leurs propres conteneurs autorisant les types incomplets. Cette approche évite les limitations imposées par la bibliothèque standard et permet des structures de données plus flexibles.
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!