Fragen zu C++ Nicht-POD-Vereinigungen

Lesezeit: 3 Minuten

Benutzer-Avatar
Skeen

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.

  1. Was ist der Standardwert von uny? – nicht definiert?
  2. 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?
  3. Hat jemand einen Link zum Sprachvorschlag, der die Gewerkschaften geändert hat, um Nicht-POD-Typen zu akzeptieren?

  • Diese Antwort enthält Details darüber, wie Sie dies tatsächlich tun können.

    – Timmm

    1. November 2018 um 10:58 Uhr

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.

  • Können Sie erklären, welche Norm das spezifiziert? C++11 oder normales C++?

    – Paul P

    19. Mai 2014 um 21:25 Uhr

Alternativen zur Vereinigung:

std::any / std::variant (C++17)

boost::any / boost::variant

Diese ermöglichen die Verwendung von Nicht-POD-Datentypen.

  • Dies ist eine sehr klar geschriebene (und 3 Jahre alte) Frage, die nach dem Verhalten von Gewerkschaften mit Nicht-POD-Typen fragt. Wie beantwortet die Nennung einiger Alternativen die Frage?

    – Chris H

    11. Oktober 2016 um 11:25 Uhr

  • @ChrisH – Weil Alternativen eine bessere Lösung bieten können. Es bietet die Möglichkeit, das Verhalten von Unions mit neuen modernen Funktionen zu vergleichen, die für den Umgang mit Nicht-POD-Datentypen entwickelt wurden. Und ich verstehe Ihren Standpunkt nicht, dass diese Frage 3 Jahre alt ist; Wenn es jetzt, in 3 oder 30 Jahren zu sehen ist, sollte es nicht ein Update wert sein? RSVP

    – Pietro

    11. Oktober 2016 um 12:52 Uhr

  • Der Beitrag stellt sehr spezifische Fragen darüber, wie sich eine Union mit Nicht-POD-Typen verhält. Wenn Sie den Vergleich der Alternativen veranschaulichen würden, würden Sie etwas Relevantes zu der Frage beitragen. So wie es ist, hast du auf ein “wie funktioniert” geantwortet x work”-Frage mit “you could use y stattdessen”. Das beantwortet die gestellten Fragen objektiv nicht. Selbst wenn sie nach Alternativen gefragt hätten, wäre dies keine gute Antwort. Die bloße Nennung von Alternativen ohne Vergleich ihrer Funktionalität bringt niemandem etwas.

    – Chris H

    11. Oktober 2016 um 14:12 Uhr


  • Was das Timing-Problem betrifft, stimme ich dem Hinzufügen voll und ganz zu gut Antworten auf alte Fragen sind wertvoll. Aber wenn sie Antworten auf eine ganz andere Frage sind als die, die gestellt wurde, und nicht einmal besonders gute Antworten darauf … es ist eine ganz andere Geschichte.

    – Chris H

    11. Oktober 2016 um 14:15 Uhr


  • Wenn Sie zusätzliche Informationen bereitstellen möchten, die Ihrer Meinung nach relevant sind, obwohl es sich nicht um eine Antwort handelt, können Sie dies in einem Kommentar tun. Stack Overflow-Antworten werden erwartet beantworte die Frage.

    – Chris H

    11. Oktober 2016 um 15:14 Uhr


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

1012600cookie-checkFragen zu C++ Nicht-POD-Vereinigungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy