提问者:小点点

C积分常量表达式定义


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

整型常量表达式是整型或无作用域枚举类型的表达式,隐式转换为正则表达式,其中转换后的表达式是核心常量表达式。[注意:如果底层类型不固定,此类表达式可以用作位字段长度、枚举器初始化器([dcl. enum])以及对齐。-结束注释]

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

>

  • 短语“隐式转换为正则值”是否意味着要将表达式视为“整数常量表达式”,它必须出现在强制将其隐式转换为正则值的上下文中?

    “转换后的表达式”指的是什么?我知道这个问题在转换后的常量表达式定义的澄清中得到了解决。那里给出的答案是“转换后的表达式”是t,在以下初始化之后:T t=expr;。但是,我看不出评估该表达式(t)将如何匹配[expr. const#4](描述表达式被视为核心常量表达式所需条件的段落)中给出的任何规则,这将使其不合格为核心常量表达式。

    谢谢你。


  • 共2个答案

    匿名用户

    将整数常量表达式隐式转换为正则表达式的语句意味着左值-右值转换应用于用作整数常量表达式的任何表达式。在表达式可能是整数常量表达式的一种情况下-初始化常量限定整数类型的非局部对象,该对象可能可用于常量表达式-初始化器无论如何都是正则值,因此不会发生解释更改。

    除此之外,你的两个问题都有相同的答案:将表达式(如所写)转换为正值整数类型所必需的任何转换也必须在核心常量表达式中允许(例如,参见 /4.7在引用之前, /6在引用之后)。“转换表达式”包括T t=e;解释中的转换,而不仅仅是id表达式t(例如,它总是左值)。

    匿名用户

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

    1. 找到所需的隐式转换序列
    2. 检查是否只使用了草稿/expr. const#7中列出http://eel.is/c转换
    3. 执行隐式转换(在这一步,我相信创建了一个新表达式,例如,如果原始表达式是f(),它是类类型A,具有用户定义的转换函数到int,并且上下文需要int,那么新表达式应该是f()。操作符int()
    4. 检查是否需要任何缩小转换
    5. 计算在第3步生成的表达式(隐式检查它是否是常量表达式

    所以我相信,正如@Davis Herring的回答所说,术语“转换表达式”是指一个新表达式,其评估包括对程序中编写的原始表达式的评估,以及对任何所需转换的评估。

    相关问题