Explizite Typkonvertierung und mehrere einfache Typspezifizierer

8

Um value ein Objekt vom Typ T zu initialisieren, würde man etwas in folgender Richtung tun:

%Vor%

Meine Frage betrifft Typen, die durch eine Kombination einfacher Typbezeichner angegeben werden, z. B. unsigned int :

%Vor%

Visual C ++ 2008 und Intel C ++ Compiler 11.1 akzeptieren beide ohne Warnungen; Comeau 4.3.10.1b2 und g ++ 3.4.5 (was zugegebenermaßen nicht besonders aktuell ist) nicht.

Gemäß dem C ++ - Standard (C ++ 03 5.2.3 / 2, expr.type.conv):

  

Der Ausdruck T() , wobei T ein einfacher Typ-Bezeichner (7.1.5.2) für einen Objekttyp ohne Array-Vollständigkeit oder den (möglicherweise cv-qualifizierten) Typ void ist, erzeugt einen R-Wert von der angegebene Typ, der value-initialisiert ist

7.1.5.2 sagt, "die einfachen Typbezeichner sind," und folgt mit einer Liste, die unsigned und int enthält.

Da in 5.2.3 / 2 "simple-type-specifier" singulär ist und unsigned und int zwei Typenbezeichner sind, sind die obigen Beispiele unsigned int ungültig? (Und wenn dies der Fall ist, ist es falsch, dass Microsoft und Intel diese Ausdrücke unterstützen?)

Diese Frage ist mehr aus Neugier als aus allem anderen; Für alle Typen, die durch eine Kombination mehrerer einfacher Typbezeichner angegeben werden, entspricht die Wertinitialisierung der Nullinitialisierung. (Diese Frage wurde durch Kommentare als Antwort auf diese Antwort ausgelöst auf eine Frage zur Initialisierung ).

    
James McNellis 27.01.2010, 01:40
quelle

4 Antworten

8

Ich veröffentlichte diese Frage in comp.lang.c ++. moderated .

Daniel Krügler vom C ++ - Standardkomitee stimmte der Interpretation zu, dass unsigned int eine Kombination von einfachen Typbezeichnern ist und nicht selbst ein einfacher Typspezifizierer ist.

Betreffend die Überschrift von Tabelle 7 referenziert von Jerry Coffin , sagt Krügler:

  

Ich stimme zu, dass die Überschrift von Tabelle 7 (die am meisten Tabelle 9 ist)   letzter Entwurf N3000) ist etwas irreführend, aber das vorausgehende   Text in [dcl.type.simple] / 2 sieht sehr klar für mich aus, wenn es heißt:

     

Tabelle 7 fasst die gültigen Kombinationen von Simple-Type-Specifier zusammen   und die Typen, die sie angeben. "

(Ich entschuldige mich, dass es so lange gedauert hat, das hier aus der Newsgroup zu posten; es ist mir völlig entfallen)

    
James McNellis 12.03.2010, 18:45
quelle
1

Lesen Sie in §7.1.5.2 weiter zu Tabelle 7, die die vollständige Liste dessen enthält, was als einfacher Spezifizierer erlaubt ist (der "unsigned int" enthält).

    
Jerry Coffin 27.01.2010 03:06
quelle
1

Hmm, manchmal brauchst du einen Typedef. Wenn es nicht heißt, dass eine Diagnose erforderlich ist, ist es nicht falsch, dass sie dies unterstützt. Dennoch können Sie für die Portabilität einen typedef ( uint16_t oder uint64_t , obwohl diese möglicherweise nicht richtig sind) verwenden oder den Typnamen mit einer Vorlage angeben:

%Vor%

Wie ist das für unvernünftig wortreich?

Bearbeiten: Duh, oder einfach 5ul . Das lässt unsigned short , unsigned char und signed char als die einzigen Typen übrig, die nicht einfach explizit erstellt werden können.

    
Potatoswatter 27.01.2010 03:01
quelle
-2

7.1.5.2:

  

Die Simple-Type-Spezifizierer geben entweder einen zuvor deklarierten benutzerdefinierten Typ oder einen der grundlegenden Typen '

an

Dies bedeutet, dass unsigned int i = unsigned int() legal ist, da unsigned int ein fundamentaler Typ ist (und somit ein einfacher Typ-Spezifizierer , siehe 3.9.1).

gilt auch für Typen wie:

%Vor%     
smerlin 27.01.2010 10:08
quelle

Tags und Links