可能重复:
字符串文字可以在常量表达式中下标吗?
如果我下标字符串文字,结果是编译时常量吗?换句话说,以下代码是否有效?
constexpr char x = "a"[0];
GCC 4.7 说它是,但是标准在这个问题上必须说什么?
对于好奇的人:我不能只写'a'
,因为字符串文字是字符串化运算符的结果。一些编译器确实有一个字符化运算符,但它只是一个扩展。
可能重复:
字符串文字可以在常量表达式中下标吗?
如果我下标字符串文字,结果是编译时常量吗?换句话说,以下代码是否有效?
constexpr char x = "a"[0];
GCC 4.7 说它是,但是标准在这个问题上必须说什么?
对于好奇的人:我不能只写'a'
,因为字符串文字是字符串化运算符的结果。一些编译器确实有一个字符化运算符,但它只是一个扩展。
我认为您正在查看 5.19 [expr.const]:
2 - 条件表达式是核心常量表达式,除非它涉及以下 [...]
- 左值到右值的转换(4.1),除非它应用于
- 整数或枚举类型的非易失性左值,它引用具有先前初始化的非易失性 const 对象,用常量表达式初始化 [注意:字符串文字 (2.14.5) 对应于此类对象的数组。——尾注] [...]
因此,字符串文字下标操作的结果可以转换为核心常量表达式中的右值。
这在为用户定义的文字和用户定义的字符串文字定义 constexpr 运算符时很有用,尽管在某些情况下可变参数形式可能更可行。