union 'punning' structs w / "common initial sequence": Warum schreibt C (99+), aber nicht C ++, eine 'sichtbare Deklaration des Unionstyps' vor?

Hintergrun

Diskussionen über die meist nicht oder nur in der Implementierung definierte Art des Type-Punings über einunion zitiere normalerweise die folgenden Bits, hier via @ecatmur https: //stackoverflow.com/a/31557852/275703), bei einer Ausnahme für Standard-Layoutstructs mit einer "gemeinsamen Anfangssequenz" von Elementtypen:

C11 6.5.2.3 Struktur und Gewerkschaftsmitglieder; Semanti):

[...] wenn eine Vereinigung mehrere Strukturen enthält, die eine gemeinsame Anfangssequenz haben (siehe unten), und wenn das Vereinigungsobjekt derzeit eine dieser Strukturen enthält, ist es zulässig, den gemeinsamen Anfangsteil einer dieser Strukturen zu untersuchen.berall dort, wo eine Erklärung über den abgeschlossenen Typ der Vereinigung sichtbar ist. Zwei Strukturen teilen sich eincommon initial sequence wenn die entsprechenden Elemente kompatible Typen (und bei Bitfeldern die gleichen Breiten) für eine Folge von einem oder mehreren Anfangselementen haben.

C ++ 03 [class.mem] / 16):

Wenn eine POD-Union zwei oder mehr POD-Strukturen enthält, die eine gemeinsame Anfangssequenz haben, und wenn das POD-Union-Objekt derzeit eine dieser POD-Strukturen enthält, ist es zulässig, den gemeinsamen Anfangsteil einer dieser Strukturen zu überprüfen. Zwei POD-Strukturen haben eine gemeinsame Anfangssequenz, wenn die entsprechenden Elemente layoutkompatible Typen (und bei Bitfeldern die gleichen Breiten) für eine Sequenz aus einem oder mehreren Anfangselementen haben.

Andere Versionen der beiden Standards haben eine ähnliche Sprache. seit C ++ 11 wird die Terminologie @ verwendStandardentwur eher, als POD.

Da keine Neuinterpretation erforderlich ist, ist dies nicht wirklich tippend, sondern nur eine Namensersetzung, die auf @ angewendet wirunion Memberzugriffe. In einem Vorschlag für C ++ 17 (das berüchtigte P0137R1) wird dies explizit mit einer Sprache wie "der Zugriff ist so, als ob das andere Strukturmitglied nominiert wäre" ausgedrückt.

Aber bitte beachten Sie die fett - "berall dort, wo eine Erklärung über den abgeschlossenen Typ der Vereinigung sichtbar ist "- eine Klausel, die in C11, aber nirgendwo in C ++ - Entwürfen für 2003, 2011 oder 2014 existiert (alle fast identisch, aber spätere Versionen ersetzen" POD "durch den neuen BegriffStandardentwur). In jedem Fall ist die 'sichtbare Erklärung vonunionas Bit vom Typ @ fehlt im entsprechenden Abschnitt eines C ++ - Standards vollständig.

@ loop und @ Mints97, hier -https: //stackoverflow.com/a/28528989/275703 - zeige, dass diese Zeile auch @ wabsent in C89, erscheint zuerst in C99 und seitdem in C (allerdings nie nach C ++ durchfiltern).

Standards Diskussionen rund um diese

[geschnippt - siehe meine Antwort]

Frage

us diesem Grund lauteten meine Frage

Was bedeutet das Was ist eine "sichtbare Deklaration"? Wollte diese Klausel den Bereich der Kontexte einschränken oder erweitern, in denen ein solches "Punning" das Verhalten definiert hat?

Sollen wir davon ausgehen, dass diese Auslassung in C ++ sehr bewusst ist?

Was ist der Grund dafür, dass sich C ++ von C unterscheidet? Hat C ++ das nur von C89 'geerbt' und dann entweder entschieden - oder noch schlimmer,vergesse - neben C99 aktualisieren?

Wenn der Unterschied beabsichtigt ist, dannWas sind die Vor- oder Nachteile der beiden verschiedenen Behandlungen in C vs C ++?

Was für interessante Konsequenzen hat es zur Kompilier- oder Laufzeit? Zum Beispiel, @ecatmur, in einem Kommentar, in dem ich auf seine ursprüngliche Antwort hingewiesen habe (Link wie oben), wie folgt spekuliert.

Ich würde mir vorstellen, dass es eine aggressivere Optimierung erlaubt; C kann annehmen, dass FunktionsargumenteS* s undT* t kein Alias, auch wenn sie eine gemeinsame Anfangssequenz haben, solange keinunion { S; T; } ist in der Ansicht, während C ++ diese Annahme nur zur Verbindungszeit machen kann. Es könnte sich lohnen, eine separate Frage zu diesem Unterschied zu stellen.

Nun, hier bin ich und frage! Ich bin sehr an irgendwelchen Gedanken interessiert, insbesondere an anderen relevanten Teilen des Standards, Zitaten von Komiteemitgliedern oder anderen geschätzten Kommentatoren, Einsichten von Entwicklern, die möglicherweise einen praktischen Unterschied bemerkt haben - vorausgesetzt, dass überhaupt ein Compiler stört, um die hinzugefügte Klausel von C durchzusetzen - und so weiter. Ziel ist es, einen nützlichen Katalog relevanter Fakten zu dieser C-Klausel und ihrer (absichtlichen oder nicht beabsichtigten) Auslassung aus C ++ zu erstellen. So lass uns gehen

Antworten auf die Frage(4)

Ihre Antwort auf die Frage