2013-11-04 11 views
11

C++ 11 gab uns die Möglichkeit, Nicht-POD-Typen innerhalb von Unionen zu verwenden, sagen wir, dass ich den folgenden Code habe;Fragen zu C++ - Nicht-POD-Verbindungen

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 Gewerkschaft), wenn überhaupt, wird zerstört werden?
  3. Angenommen, ich muss std :: typeinfo, um zu verfolgen, welches das aktive Mitglied ist, sollte ich dann den Destruktor explizit für dieses Mitglied im Destruktor aufrufen?
  4. Hat jemand einen Link zum Sprachvorschlag, der die Gewerkschaften dahingehend geändert hat, dass sie keine POD-Typen akzeptieren?

Antwort

13

Sie sind meistens alleine. Ein Hinweis in der Norm erläutert diesen (9.5/2):

Wenn ein nicht statisches Datenelement einer Vereinigung einen nicht-trivialen Standard Konstruktor (12.1), Kopier-Konstruktor (12.8), bewegt Konstruktor (12.8), Kopierzuweisungsoperator (12.8), Verschieben Zuweisungsoperator (12.8) oder Destruktor (12.4), die entsprechende Elementfunktion der Union muss user-provided sein oder wird implizit gelöscht (8.4.3) für die Union. So

, wenn eines der Mitglieds Konstrukteuren sind nicht trivial, müssen Sie einen Konstruktor für die Vereinigung schreiben (wenn sie alles andere als trivial sind, wird der Standardzustand nicht initialisiert werden, wie für union { int; double; }). Wenn Mitglieder einen Destruktor haben, müssen Sie einen Destruktor für die Union schreiben, der sich darum kümmert, das aktive Element herauszufinden.

Es gibt eine weitere Note (9,5/4) über typische Verwendung einer unbeschränkten Vereinigung:

Im Allgemeinen ein ausdrücklichen destructor Anrufe und die Platzierung neue Betreiber verwenden, müssen das aktive Mitglied einer Gewerkschaft zu ändern.

+0

können Sie klären, welcher Standard spezifiziert das? C++ 11 oder reguläres C++? – Pavel

+1

@Pavel: C++ 11, das ist * das reguläre C++ an diesem Punkt. –

0

Alternativen zur Union:

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

boost::any/boost::variant

Diese erlauben nicht-POD-Datentypen zu verwenden.

+0

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 Benennung einiger Alternativen die Frage? –

+1

@ChrisH - Weil Alternativen eine bessere Lösung bieten können. Es ermöglicht die Möglichkeit, das Verhalten von Gewerkschaften mit neuen modernen Funktionen zu vergleichen, die für den Umgang mit Nicht-POD-Datentypen ausgelegt sind. Und ich verstehe Ihren Standpunkt nicht darüber, dass diese Frage 3 Jahre alt ist; Wenn es jetzt, in 3 oder 30 Jahren, gesehen werden kann, sollte es keine Aktualisierung wert sein?RSVP – Pietro

+2

Der Beitrag fragt sehr spezifische Fragen darüber, wie eine Union mit Nicht-POD-Typen verhält. Wenn Sie veranschaulichen würden, wie sich die Alternativen vergleichen, würden Sie etwas beitragen, das für die Frage relevant ist. So wie es ist, haben Sie eine "wie funktioniert' x 'Arbeit "-Frage mit" Sie könnten stattdessen 'y'" beantwortet. Das ist objektiv nicht beantwortet die gestellten Fragen. Selbst wenn sie nach Alternativen gefragt hätten, wäre das keine gute Antwort. Einfaches Benennen von Alternativen ohne Vergleich ihrer Funktionalität ist für niemanden von Vorteil. –