I know it's perfectly possible to initialise a char
array with a string literal:
char arr[] = "foo";
C++11 8.5.2/1 says so:
A
char
array (whether plainchar
,signed char
, orunsigned char
),char16_t
array,char32_t
array, orwchar_t
array can be initialized by a narrow character literal,char16_t
string literal,char32_t
string literal, or wide string literal, respectively, or by an appropriately-typed string literal enclosed in braces. Successive characters of the value of the string literal initialize the elements of the array. ...
However, can you do the same with two string literals in a conditional expression? For example like this:
char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";
(Where MY_BOOLEAN_MACRO()
expands to a 1
or 0
).
The relevant parts of C++11 5.16 (Conditional operator) are as follows:
1 ... The first expression is contextually converted to
bool
(Clause 4). It is evaluated and if it istrue
, the result of the conditional expression is the value of the second expression, otherwise that of the third expression. ...4 If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category and it is a bit-field if the second or the third operand is a bit-field, or if both are bit-fields.
Notice that the literals are of the same length and thus they're both lvalues of type const char[4]
.
GCC one ideone accepts the construct. But from reading the standard, I am simply not sure whether it's legal or not. Does anyone have better insight?