Maison > développement back-end > C++ > le corps du texte

Pourquoi ne pouvez-vous pas utiliser `std::string` dans une union C ?

Patricia Arquette
Libérer: 2024-11-16 17:58:03
original
163 Les gens l'ont consulté

Why Can't You Use `std::string` in a C   Union?

Pourquoi le compilateur n'autorise-t-il pas std::string dans les unions ?

Lorsque vous travaillez avec C, il est souvent nécessaire d'utiliser des structures de données qui peut stocker différents types de données. L'une de ces structures est une union, qui attribue plusieurs variables au même emplacement mémoire. Cependant, une question courante se pose concernant les limites que les syndicats imposent à leurs membres.

Une restriction importante est l'incapacité d'inclure une classe avec un constructeur de copie non trivial dans un syndicat. Cela inclut des classes comme std::string. Pour comprendre pourquoi, envisagez les scénarios suivants :

union U {
  std::string x;
  std::vector<int> y;
};

U u; // <--
Copier après la connexion

Traditionnellement, dans une structure, l'initialisation de u.x ou u.y les définirait sur les valeurs par défaut. Cependant, dans une union, tous les membres partagent la même adresse, ce qui rend impossible l'attribution de valeurs aux deux membres sans écraser les données. Si aucun des membres n'est initialisé, leur utilisation entraînerait un comportement indéfini.

C 98 a résolu ce problème en interdisant aux classes avec des constructeurs non triviaux d'être membres d'unions. Plus précisément, il a déclaré au §9.5/1 :

"Un objet d'une classe avec un constructeur non trivial (12.1), un constructeur de copie non trivial (12.8), un destructeur non trivial (12.4) , ou un opérateur d'affectation de copie non trivial (13.5.3, 12.8) ne peut pas être membre d'une union, pas plus qu'un tableau de tels objets. "

Cette restriction garantit que la manipulation des données au sein des unions peut être gérée efficacement.

C 0x a assoupli cette règle dans une certaine mesure (§9.5/2), autorisant au plus un membre de données non statique avec un initialiseur accolade ou égal. Cependant, écrire des constructeurs et des destructeurs de copie sans erreur pour les unions reste complexe. Pour cette raison, les unions étiquetées ou les bibliothèques tierces comme boost::variant et boost::any proposent des solutions alternatives pour travailler avec des données hétérogènes.

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