我知道使用字符串字面值可以完全初始化一个char
数组:
char arr[] = "foo";
C++11 8.5.2/1规定:
一个字符数组(无论是普通的
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()
将扩展为1
或0
。)
C++11 5.16(条件运算符)的相关部分如下:
1…第一个表达式被上下文转换为
bool
(第4章)。它被评估,如果它是true
,条件表达式的结果是第二个表达式的值,否则是第三个表达式的值。...4 如果第二个和第三个操作数是相同值类型的glvalue,并且具有相同的类型,则结果是该类型和值类别,如果第二个或第三个操作数是位字段,或两者都是位字段,则是位字段。
请注意,这些字面量的长度相同,因此它们都是const char[4]
类型的lvalue。
GCC one ideone接受这种构造方式。但从标准的阅读中,我并不确定它是否合法。有没有人有更好的见解?