C ++ 11 gab uns die Möglichkeit, Nicht-POD-Typen innerhalb von Unions zu verwenden, sagen wir, ich habe den folgenden Code;
union
{
T one;
V two;
} uny;
Irgendwo in meiner Klasse wird immer nur ein Mitglied aktiv sein, jetzt sind meine Fragen ziemlich einfach.
- Was ist der Standardwert von uny? – nicht definiert?
- Wann immer meine Klasse zerstört wird, welche Mitglieder (innerhalb der Union) werden zerstört, wenn überhaupt?
- Angenommen, ich muss std::typeinfo verwenden, um zu verfolgen, welches das aktive Mitglied ist, sollte ich dann den Destruktor explizit für dieses Mitglied im Destruktor aufrufen?
- Hat jemand einen Link zum Sprachvorschlag, der die Gewerkschaften geändert hat, um Nicht-POD-Typen zu akzeptieren?
Du bist meistens auf dich alleine gestellt. Ein Hinweis im Standard erklärt dies (9.5/2):
Wenn ein nicht statisches Datenelement einer Union einen nicht trivialen Standardkonstruktor (12.1), Kopierkonstruktor (12.8), Verschiebekonstruktor (12.8), Kopierzuweisungsoperator (12.8), Verschiebezuweisungsoperator (12.8) oder Destruktor ( 12.4), muss die entsprechende Mitgliedsfunktion der Union vom Benutzer bereitgestellt werden oder sie wird für die Union implizit gelöscht (8.4.3).
Wenn also einer der Memberkonstruktoren nicht trivial ist, müssen Sie einen Konstruktor für die Union schreiben (wenn sie alle trivial sind, ist der Standardzustand nicht initialisiert, wie z union { int; double; }
). Wenn Mitglieder einen Destruktor haben, müssen Sie einen Destruktor für die Union schreiben, der sich darum kümmern muss, das aktive Element herauszufinden.
Es gibt einen weiteren Hinweis (9.5/4) zur typischen Verwendung einer uneingeschränkten Vereinigung:
Im Allgemeinen muss man explizite Destruktoraufrufe verwenden und neue Operatoren platzieren, um das aktive Mitglied einer Union zu ändern.
Alternativen zur Vereinigung:
std::any
/ std::variant
(C++17)
boost::any
/ boost::variant
Diese ermöglichen die Verwendung von Nicht-POD-Datentypen.
Es ist eine knifflige Frage.
vielleicht kannst du das verwenden:
uny un;
new(&un.one) T;
Sie können sich darauf beziehen
https://en.cppreference.com/w/cpp/language/union
Diese Antwort enthält Details darüber, wie Sie dies tatsächlich tun können.
– Timmm
1. November 2018 um 10:58 Uhr