Um value ein Objekt vom Typ T
zu initialisieren, würde man etwas in folgender Richtung tun:
Meine Frage betrifft Typen, die durch eine Kombination einfacher Typbezeichner angegeben werden, z. B. unsigned int
:
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()
, wobeiT
ein einfacher Typ-Bezeichner (7.1.5.2) für einen Objekttyp ohne Array-Vollständigkeit oder den (möglicherweise cv-qualifizierten) Typvoid
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 ).
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)
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).
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:
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.
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%Tags und Links c++ value-initialization