Ich weiß es durchaus möglich ist, eine char
Array mit einem String-Literal zu initialisieren:Kann ein Zeichen-Array mit einem bedingt ausgewählten String-Literal initialisiert werden?
char arr[] = "foo";
C++ 11 8.5.2/1 sagt so:
A
char
Array (ob schlichtchar
,signed char
oderunsigned char
),char16_t
array,char32_t
Array oderwchar_t
Array kannchar16_t
Stringliteral, 0.123.053 durch einen schmalen Zeichenliteral, initialisiert werden,Zeichenfolge Literal bzw. Wide-String-Literal oder durch ein entsprechend typisiertes String-Literal in geschweiften Klammern. Aufeinander folgende Zeichen des Wertes des Zeichenfolgenliterals initialisieren die Elemente des Arrays. ...
Sie können jedoch das gleiche mit zwei Stringliterale in einem bedingten Ausdruck? Zum Beispiel wie folgt aus:
char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";
(Wo MY_BOOLEAN_MACRO()
expandiert nach einem 1
oder 0
).
Die relevanten Teile ++ 11 5,16 (Conditional-Operator) C sind wie folgt:
1 ... Der erste Ausdruck auf kontextuell
bool
(Abschnitt 4) umgewandelt wird. Es wird ausgewertet, und wenn estrue
ist, ist das Ergebnis des bedingten Ausdrucks der Wert des zweiten Ausdrucks andernfalls des dritten Ausdrucks. ...4 Wenn der zweite und dritte Operand glvalues der gleichen Wertkategorie sind und denselben Typ haben, ist das Ergebnis von diesem Typ und Werttyp und es ist ein Bitfeld wenn der zweite oder der dritte Operand ist ein Bit-Feld, oder wenn beide Bit-Felder sind.
Beachten Sie, dass die Literale die gleiche Länge haben und somit beide Werte vom Typ const char[4]
sind.
GCC one ideone akzeptiert das Konstrukt. Aber vom Lesen des Standards bin ich einfach nicht sicher, ob es legal ist oder nicht. Hat jemand einen besseren Einblick?
Zustimmen, 8.5.2/1 scheint ziemlich klar, dass es * string literal * und nicht * ein Ausdruck ist, der zu einem String-Literal * auswertet. (auch wenn Sie den ternären Operator in diesem Fall als ein String-Literal bewerten). –