[dcl.]c++标准中的Constexpr]p5

Rationale for [dcl.constexpr]p5 in the c++ standard

本文关键字:Constexpr p5 标准 dcl c++      更新时间:2023-10-16

[dcl. cn]的基本原理是什么?constexpr] p5 (http://eel.is/c + +/dcl.constexpr # 5)草案?

对于非模板、非默认的constexpr函数或非模板、非默认、非继承constexpr构造函数不存在任何参数值,使得函数的调用或构造函数可以是核心常量的求值子表达式表达式([expr.const]),对于构造函数,则为常量对于某个对象([basic.start.init])的初始化器,程序是不规范的;不需要诊断。

如果程序违反了这条规则,声明违反规则的函数constexpr是无用的。那又怎样?接受对decl-specifier constexpr的无用使用,而不是触发未定义的行为(不需要诊断),这不是更好吗?除了未定义行为的问题外,我们还遇到了规则[dcl]的额外复杂性。

在某些情况下,实现仍然可以提供它能够检测到的有用的诊断消息(按照约定的警告)。就像下面的例子:

int main() { 0; }

main中的表达式格式良好,但无用。有些编译器无论如何都会以警告的形式发出诊断消息(并且它们被允许这样做)。

我明白[dcl]。p5不需要诊断,所以我不是在问这个。

它是病态的原因是使它病态的允许实现拒绝不可能形成常量表达式的constexpr函数定义。尽早拒绝它们意味着得到更有用的诊断。

不需要诊断的原因是,对于一个实现来说,要确定对于每一个可能的参数组合,结果都不是一个常量表达式,这可能是不现实的。

事实上,不需要诊断,实际上意味着使行为未定义对我来说似乎是不幸的,但只是因为缺乏更好的选择而被选中。如果意图实际上是允许任何任意的运行时行为,我会非常惊讶,但是对于c++中的任何语言特性都没有"可能被诊断为错误,但如果不是,必须按照指定的方式行事"的概念。