【发布时间】:2019-06-05 16:16:28
【问题描述】:
在当前的 C++ 标准中有以下段落 (expr.const#5)(强调我的):
整型常量表达式是整型或无作用域枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。 [ 注意:此类表达式可以用作位字段长度,如果基础类型不固定([dcl.enum]),则可以用作枚举器初始化器,还可以用作对齐方式。 — 尾注 ]
关于这个定义我有两个问题:
短语“隐式转换为纯右值”是否意味着要将表达式视为“整型常量表达式”,它必须出现在强制将其隐式转换为纯右值的上下文中?
“转换后的表达式”指的是什么?我知道这个问题在Clarification of converted constant expression definition 中得到解决。那里给出的答案是“转换后的表达式”是
t,经过以下初始化:T t = expr;。但是,我看不出评估该表达式 (t) 将如何匹配 [expr.const#4] 中给出的任何规则(描述将表达式视为核心常量表达式的必要条件的段落 em>) 这将使其无法成为核心常量表达式。
谢谢。
【问题讨论】:
-
奇怪,我认为转换后的表达式是指右值表达式,它是左值到右值转换的结果。
-
@PasserBy 对我来说,将左值到右值转换的结果称为表达式很奇怪,因为我只考虑我在程序中编写的表达式。无论如何,为了确定一个表达式是否是一个核心常量表达式,我们必须考虑在它的求值过程中会发生什么。如果“转换后的表达式”指的是作为左值到右值转换结果的纯右值表达式,那么对这种表达式的求值究竟涵盖了什么? [继续]
-
例如,如果原始表达式是
f(),其中f被声明为int& f();,那么“转换后的表达式”的求值是否包括在函数f内执行的语句? -
@user42768:它被认为是一个表达式,因为诸如值类别和常量评估规则之类的东西是根据表达式定义的(并考虑有多少隐式表达式是由隐式定义的赋值引入的操作员)。是的,考虑
f的内容; restrictions on constexpr 函数本身还不够强大。 -
@PasserBy:标准的disagrees关于具有值类别的值,尽管说某些表达式只有引用类型非常接近正确。
标签: c++ language-lawyer constant-expression