作为常量初始值设定项表达式的一部分,字符串文字转换为 bool 是否有效?
Is a string literal converted to bool valid as part of a constant initializer expression?
enum {
compile_time_assertion = 1 / ("description" && 1);
};
上面的代码片段是否符合 C11?将字符串文字作为表达式的一部分可能会违反初始化表达式的众多约束之一。
- 6.6p7 列出了一个地址常量作为可能的初始化表达式。
- 6.6p9 将“指向指定静态存储持续时间对象的左值的指针”列为可能的地址常量。
- 6.6p9 要求通过使用数组 [...] 类型的表达式来创建表达式。
根据上述标准,字符串文字可以用在初始化表达式中。在表达式 "" && 1
中使用字符串文字可能会违反约束:
- 6.6p6 没有将字符串文字列为整型常量表达式。
- 6.6p8 没有将“指向左值的指针”列为可能的操作数。
因此,我得出结论,字符串文字本身可以用作初始化程序中的表达式,但不能用作运算符的操作数 &&
。
将上述代码片段转换为整数常量表达式的一种简单方法是在字符串文字前放置一个 sizeof
。
以上推理是否正确?我错过了什么吗?
枚举常量需要“整型常量表达式”(ICE):
The expression that defines the value of an enumeration constant shall
be an integer constant expression that has a value representable as an
int
.
字符串文字的地址(在此上下文中它转换成的地址)不是这样的 ICE。
因此,在您的推理中,您忽略了这样一个事实:无论何时在表达式中使用字符串文字都会转换为其地址。您似乎也错过了 ICE 的定义,它非常严格,特别是比“整数类型的常量表达式”更严格。
enum {
compile_time_assertion = 1 / ("description" && 1);
};
上面的代码片段是否符合 C11?将字符串文字作为表达式的一部分可能会违反初始化表达式的众多约束之一。
- 6.6p7 列出了一个地址常量作为可能的初始化表达式。
- 6.6p9 将“指向指定静态存储持续时间对象的左值的指针”列为可能的地址常量。
- 6.6p9 要求通过使用数组 [...] 类型的表达式来创建表达式。
根据上述标准,字符串文字可以用在初始化表达式中。在表达式 "" && 1
中使用字符串文字可能会违反约束:
- 6.6p6 没有将字符串文字列为整型常量表达式。
- 6.6p8 没有将“指向左值的指针”列为可能的操作数。
因此,我得出结论,字符串文字本身可以用作初始化程序中的表达式,但不能用作运算符的操作数 &&
。
将上述代码片段转换为整数常量表达式的一种简单方法是在字符串文字前放置一个 sizeof
。
以上推理是否正确?我错过了什么吗?
枚举常量需要“整型常量表达式”(ICE):
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an
int
.
字符串文字的地址(在此上下文中它转换成的地址)不是这样的 ICE。
因此,在您的推理中,您忽略了这样一个事实:无论何时在表达式中使用字符串文字都会转换为其地址。您似乎也错过了 ICE 的定义,它非常严格,特别是比“整数类型的常量表达式”更严格。