Heim > Backend-Entwicklung > C++ > Warum können Sie „std::string' nicht in einer C-Union verwenden?

Warum können Sie „std::string' nicht in einer C-Union verwenden?

Patricia Arquette
Freigeben: 2024-11-16 17:58:03
Original
230 Leute haben es durchsucht

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

Warum lässt der Compiler std::string in Unions nicht zu?

Bei der Arbeit mit C ist es oft notwendig, Datenstrukturen zu verwenden das verschiedene Arten von Daten speichern kann. Eine solche Struktur ist eine Union, die mehrere Variablen demselben Speicherort zuweist. Es stellt sich jedoch häufig die Frage, welche Einschränkungen Gewerkschaften für ihre Mitglieder haben.

Eine wesentliche Einschränkung ist die Unmöglichkeit, eine Klasse mit einem nicht trivialen Kopierkonstruktor in eine Union aufzunehmen. Dazu gehören Klassen wie std::string. Um zu verstehen, warum, betrachten Sie die folgenden Szenarien:

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

U u; // <--
Nach dem Login kopieren

Traditionell wurden in einer Struktur durch die Initialisierung von u.x oder u.y diese auf Standardwerte gesetzt. Allerdings haben in einer Union alle Mitglieder dieselbe Adresse, sodass es unmöglich ist, beiden Mitgliedern Werte zuzuweisen, ohne Daten zu überschreiben. Wenn keines der Mitglieder initialisiert ist, würde ihre Verwendung zu undefiniertem Verhalten führen.

C 98 hat dieses Problem behoben, indem es Klassen mit nicht trivialen Konstruktoren verboten hat, Mitglieder von Gewerkschaften zu sein. Konkret hieß es in §9.5/1:

„Ein Objekt einer Klasse mit einem nicht-trivialen Konstruktor (12.1), einem nicht-trivialen Kopierkonstruktor (12.8), einem nicht-trivialen Destruktor (12.4)“ oder ein nicht trivialer Kopierzuweisungsoperator (13.5.3, 12.8) kann kein Mitglied einer Union sein, noch kann ein Array davon Mitglied sein Objekte.“

Diese Einschränkung stellt sicher, dass Datenmanipulation innerhalb von Gewerkschaften effektiv gehandhabt werden kann.

C 0x hat diese Regel etwas gelockert (§9.5/2) und erlaubt höchstens eine nichtstatische Datenelement mit einem Initialisierer, der eine geschweifte Klammer oder gleich ist. Das Schreiben fehlerfreier Kopierkonstruktoren und Destruktoren für Unions ist jedoch immer noch komplex. Aus diesem Grund bieten getaggte Unions oder Bibliotheken von Drittanbietern wie boost::variant und boost::any alternative Lösungen für die Arbeit mit heterogenen Daten.

Das obige ist der detaillierte Inhalt vonWarum können Sie „std::string' nicht in einer C-Union verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage