2014-09-11 4 views
5

§ 9.5/9 aus der C++ 11 Standard (Hervorhebung von mir):Potenziell mehrdeutige Aussage in § 9.5/8

A Vereinigung artige Klasse ist eine Vereinigung oder eine Klasse, die ein anonymes hat Gewerkschaft als direktes Mitglied. Eine Union-ähnliche Klasse X hat eine Reihe von Variante Mitglieder. Wenn X ein union ist, ist ein nicht statisches Datenelement von X, das keine anonyme Union ist, ein variantes Mitglied von X.

Ist das Teil in fett Spruch, dass die zwischen einer Vereinigung artigen Klasse entweder eine Klasse oder eine Vereinigung ist, nur dann, wenn es sich um eine Vereinigung ist, kann es eine nicht-statische Variante Mitglied haben, das nicht eine anonyme Union ist ? Wenn das so ist, warum? Und welchen praktischen Unterschied macht es im Code?

Ich bin tatsächlich in Frage, ob diese Aussage sagen wollte "Wenn X ist eine Union-ähnliche Klasse ...". Es würde mir dann voll und ganz Sinn machen.

Wie auch immer, diese Klausel hat mich in den letzten paar Tagen gestört und ich möchte vollständig verstehen, was es sagt.

+1

Die Terminologie "variantes Mitglied" bezieht sich auf das Konzept einer "Variante" (z. B. "VARIANT" in Windows). Der fett gedruckte Text definiert * variant member * für den Fall, dass 'X' eine Union ist. Der folgende Satz (den Sie nicht zitiert haben) definiert * variant member * für den Fall, dass 'X' keine Union ist, und für den Fall von anonymen Vereinigungen, die ein Mitglied von' X' sind. –

Antwort

5

Nein, Ihre versuchte Klärung ist falsch. Hier ist eine Vereinigung artige Klasse X:

struct X 
{ 
    int a; 
    union { 
     double b; 
     long c; 
    }; 
}; 

X::a ist ein nicht-statische Daten Mitglied einer Gewerkschaft artigen Klasse X, die nicht eine anonyme Vereinigung ist. Aber es ist definitiv kein Mitglied der Variante.

Alle nicht statischen Datenelemente einer Union sind Variantenmitglieder. Bei gewerkschaftsähnlichen Klassen, bei denen es sich nicht um Vereinigungen handelt, sind nur diejenigen, die in Union-Unterobjekten verschachtelt sind, Variantenmitglieder.

2

Ich fühle Ihren Schmerz, es dauert viele Jahre kognitiven Schäden, die durch das Betrachten von Standarddokumenten verursacht werden, um diese Art von Zeug richtig analysieren zu können.

Nur wenn es sich um eine Union handelt, kann es eine nicht statische Variante haben, die keine anonyme Vereinigung ist?

Nicht ganz.

Es heißt nicht, dass nur die Union-Version einer union-ähnlichen Klasse kann das nicht-statische blah blah blah haben.

Was es sagt ist beide können es haben (technisch, es ist nicht sagen, die aber es ist rückläufig, die Möglichkeit zu widerlegen), sondern nur die Vereinigung Version wird es als „eine Variante Mitglied von X“ behandelt.

0

Scheint, wie latest publicly avalable draft (2013.10.13) eine verfeinerte Definition, Zitat:

A Vereinigung artige Klasse ist eine Vereinigung oder eine Klasse, die eine anonyme Vereinigung als direkte hat Mitglied. Eine Union-ähnliche Klasse X hat einen Satz von Variante Mitglieder.Wenn X eine Union ist, ist ein nicht statischer Datenmember von X keine anonyme Union ist ein variantes Mitglied von X. Darüber hinaus ist ein nicht statisches Datenelement einer anonymen Union, die ein Mitglied von X ist, auch ein variantes Mitglied von X. Es kann höchstens eine Variante einer Union eine Klammer-oder-Gleich-Initialisierer haben. Beispiel:

union U { 
    int x = 0; 
    union { }; 
    union { 
     int z; 
     int y = 1; // error: initialization for second variant member of U 
    }; 
}; 

Was die Frage der bolded Teil definiert eigentlich, was a Varianten Mitglied, die eine Union artige Klasse haben muss (durch ein union als direktes Element) eine Union-ähnliche Klasse sein.

+0

Umm, das ist nicht der aktuelle Entwurf. Ihre Formulierung ist tatsächlich älter als die in der Frage (die möglicherweise nicht aus dem offiziellen C++ 11-Wortlaut stammt, wie er behauptet). –

+0

@BenVoigt in der Tat, aktualisiert. –