C ++整数常量表达式定义

时间:2019-06-05 16:16:28

标签: c++ language-lawyer constant-expression

在当前的C ++标准中,有以下段落(expr.const#5)(强调我的意思):

  

整数常量表达式是整数或无范围枚举类型的表达式,隐式转换为prvalue ,其中转换后的表达式是核心常量表达式。 [注意:此类表达式可用作位域长度,如果基础类型不固定([dcl.enum])则用作枚举器初始化程序以及对齐方式。 —尾注]

关于这个定义,我有两个问题:

  1. 短语“隐式转换为prvalue”是否意味着一个表达式被视为“整数常量表达式”,它必须出现在强制将其隐式转换为prvalue的上下文中?

  2. “转换后的表达式”指的是什么?我知道Clarification of converted constant expression definition中已经解决了这个问题。在以下初始化之后,给出的答案是“转换后的表达式”为tT t = expr;。但是,我没有看到评估该表达式(t)如何匹配[expr.const#4]中给出的任何规则(描述将表达式视为核心常量表达式的必要条件的段落),这将使其不符合核心常量表达式

谢谢。

2 个答案:

答案 0 :(得分:1)

将整数常量表达式 隐式转换为prvalue的声明意味着将左值到右值转换应用于用作整数常量表达式的任何表达式。在一个表达式可能是整数常量表达式的情况下(初始化可能在常量表达式中使用的const限定整数类型的非本地对象),无论如何初始化器都是prvalue,所以无论如何解释可能会发生变化。

除此之外,您的两个问题都有相同的答案:在核心常量表达式中也必须允许将表达式(按书面形式)转换为prvalue整数类型所需的任何转换(例如,{{3 }}放在您被引文之前,/4.7放在它之后。 “转换后的表达式”包括T t=e;解释中的转换,而不仅仅是 id-expression t(例如,它始终是左值)。

答案 1 :(得分:1)

我查看了clang的源代码,特别是“ SemaOverload.cpp”中的函数“ CheckConvertedConstantExpression”。在那里执行的操作如下:

  1. 找到所需的隐式转换顺序
  2. 检查是否仅使用http://eel.is/c++draft/expr.const#7中列出的转化
  3. 执行隐式转换(在这一步,我相信会创建一个新表达式,例如,如果原始表达式为f(),其类型类型为A,且用户定义的转换函数为int,并且上下文需要一个int,则新表达式应为f().operator int()
  4. 检查是否需要任何缩小转换
  5. 计算在步骤3生成的表达式(它隐式检查它是否为constant expression

因此,我相信,如@Davis Herring的answer中所述,术语“转换后的表达式”是指一种新表达式,其求值包括对程序中编写的原始表达式的求值和对程序的求值。任何所需的转换。