C语言整型变量:C++ 整型常量表达式定义(what is the integral of a constant)

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

整型常量表达式是整数或无作用域枚举类型的表达式,隐式转换为 prvalue,其中转换后的表达式是核心常量表达式。[注意:此类表达式可用作位字段长度,如果基础类型不固定([dcl.enum]),则可用作枚举数初始值设定项,并用作对齐方式。-尾注]

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

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

“转换后的表达式”指的是什么?我知道这个问题在Clarification of converted constant expression definition中得到了解决。在那里给出的答案是“转换后的表达式”是t,在以下初始化之后:T t = expr;。但是,我不明白如何评估该表达式 (t) 将与 [expr.const # 4] 中给出的任何

非常感谢。

2

整型常量表达式隐式转换为 prvalue 的语句意味着 lvalue-to-rvalue 转换应用于用作整型常量表达式的任何表达式。在表达式可能是整型常量表达式的情况下-初始化可能在常量表达式中可用的 const 限定的整数类型的非局部对象-初始化器是 prvalue,因此无论如何都不会发生解释的变化。

除此之外,您的两个问题都有相同的答案:在核心常量表达式中也必须允许将表达式(如所写)转换为 prvalue 整型所需的任何转换(例如,参见/4.7在您的引用之前和/6在它之后)。

2

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

找到所需的隐式转换序列

检查是否仅使用http://eel.is/c++draft/expr.const#7中列出的转换

执行隐式转换(在这一步,我相信创建了一个新的表达式,例如,如果原始表达式是f(),它是类类型A,具有用户定义的转换函数 int,并且上下文需要int,那么新表达式应该是f().operator int()

检查是否需要任何收缩转换

评估在步骤 3 生成的表达式(隐式检查它是否是constant expression

因此,我相信,正如 @ Davis Herring 的answer中所述,术语“转换后的表达式”表示一个新表达式,其评估包括对程序中编写的原始表达式的评估以及对任何所需转换的评估。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(68)
Clc r:在 Tee-clc.MacOS中更改默认凭据
上一篇
Kodi安卓:安卓分贝仪(decibel meter app free android)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(49条)