在编译时常量中订阅字符串文字

时间:2012-09-21 12:13:49

标签: c++ c++11 language-lawyer constexpr

  

可能重复:
  Can a string literal be subscripted in a constant expression?

如果我下标一个字符串文字,结果是编译时常量吗?换句话说,以下代码是否有效?

constexpr char x = "a"[0];

GCC 4.7说它是,但标准在这个问题上有什么意义?

对于好奇:我不能只写'a',因为字符串文字是字符串化运算符的结果。有些编译器确实有一个charizing运算符,但它只是一个扩展。

1 个答案:

答案 0 :(得分:3)

我想你正在看5.19 [expr.const]:

  

2 - 条件表达式是核心常量表达式,除非它涉及以下[...]

之一      
      
  • 左值 - 右值转换(4.1),除非适用于   
        
    • 整数或枚举类型的非易失性glvalue,它引用非易失性const对象   前面的初始化,用常量表达式初始化[注意:字符串文字(2.14.5)   对应于这样的对象的数组。 - 后注] [...]
    •   
  •   

因此,字符串文字下标操作的结果可能会转换为核心常量表达式中的右值。

这在为用户定义的文字和用户定义的字符串文字定义constexpr运算符时很有用,尽管在某些情况下可变参数形式可能更有用。