Я знаю, что вполне возможно инициализировать массив char
строковым литералом:
char arr[] = "foo";
С++ 11 8.5.2/1 говорит так:
A
char
(будь то обычный массивchar
,signed char
илиunsigned char
),char16_t
, массивchar32_t
илиwchar_t
массив может быть инициализирован узким символьным литералом,char16_t
строковый литерал, строкаchar32_t
литерального или широкого строкового литерала, соответственно, или соответствующим образом напечатанным строковым литералом, заключенным в фигурные скобки. Последовательные символы значения строкового литерала инициализируют элементы массива....
Однако, можете ли вы сделать то же самое с двумя строковыми литералами в условном выражении? Например, например:
char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";
(Где MY_BOOLEAN_MACRO()
расширяется до a 1
или 0
).
Соответствующие части С++ 11 5.16 (Условный оператор) следующие:
1... Первое выражение преобразуется контекстом в
bool
(раздел 4). Он оценивается, и если онtrue
, результатом условного выражения является значение второго выражения, в противном случае третьего выражения....4 Если второй и третий операнды являются glvalues одной и той же категории значений и имеют один и тот же тип, результат относится к типу и категории значений, и это бит-поле, если второй или третий операнд является битовым полем, или если оба являются битовыми полями.
Обратите внимание, что литералы имеют одинаковую длину и, следовательно, они оба являются значениями типа const char[4]
.
GCC one ideone принимает конструкцию. Но, читая стандарт, я просто не уверен, законно это или нет. Кто-нибудь лучше понимает?