Maison > Article > développement back-end > Les types incomplets peuvent-ils être instanciés dans des conteneurs standard ?
Instanciation de type incomplète dans des conteneurs standards
En C , des conteneurs comme std::vector et std::map permettent l'instanciation de conteneurs avec types incomplets. Cette pratique était couramment utilisée pour créer des structures récursives à travers des types autoréférentiels. Cependant, la norme C soulève la question de savoir si de telles instanciations sont autorisées.
Selon le §17.6.4.8 de la norme C 11, les instanciations de types incomplètes peuvent conduire à un comportement indéfini si elles ne sont pas explicitement autorisées. Certains conteneurs, tels que std::vector, fonctionnent de manière appropriée avec des types incomplets car ils ne possèdent pas de membres value_type ou de fonctions qui interagissent avec les objets value_type par valeur. Cependant, std::map présente un comportement problématique à cet égard.
L'intention de la norme est d'interdire les instanciations de types incomplètes, même si des implémentations spécifiques peuvent ne pas rencontrer de problèmes. Cela est principalement dû à des difficultés potentielles de mise en œuvre, telles que l'optimisation de std::vector pour un nombre fixe d'éléments, qui pourraient échouer si les structures récursives étaient autorisées.
Par conséquent, la norme impose l'utilisation de types complets pour les conteneurs. instanciation. Cependant, il reconnaît la possibilité de créer des modèles de classe personnalisés qui prennent explicitement en charge les types incomplets, comme illustré par std::unique_ptr.
Par conséquent, les conteneurs standard ne doivent pas être instanciés avec des types incomplets, bien qu'il soit permis de concevoir des modèles de classe personnalisés adaptés à une telle utilisation.
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!