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


  对于非模板,非默认constexpr函数或
  非模板,非默认,非继承constexpr构造函数,如果
  不存在任何参数值,因此无法调用该函数或
  构造函数可以是核心常量的评估子表达式
  表达式([expr.const]),或者,对于构造函数,为常量
  某个对象的初始化程序([basic.start.init]),程序是
  格式错误无需诊断。


如果程序违反了此规则,则声明有问题的函数constexpr是无用的。所以呢?接受decl-specifier constexpr的无用用法而不是触发未定义的行为(不需要诊断)是否更好?除了行为不确定的问题外,标准中还包含规则[dcl.constexpr] p5。

在某些情况下,实现仍可以提供有用的诊断消息(按照惯例发出警告)。就像在以下情况下一样:

int main() { 0; }


主要的表达形式正确,但没有用。某些编译器始终以警告的形式发出诊断消息(并且允许这样做)。

我了解[dcl.constexpr] p5不需要诊断,因此我没有提出任何疑问。我只是在问为什么这个规则即使在标准中也是如此。

最佳答案

它格式不正确的原因是,使其格式不正确允许实现拒绝可能无法形成常量表达式的constexpr函数定义。尽早拒绝它们意味着获得更多有用的诊断信息。

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

格式错误,不需要诊断的事实实际上意味着与使行为不确定的事情相同,在我看来,这似乎是不幸的,但仅仅是因为缺少更好的选择而已。如果意图实际上是允许任何任意的运行时行为,我将感到非常惊讶,但是对于C ++中的任何语言功能,都没有“可能被诊断为错误,但如果没有,必须按照指定的方式运行”的概念。

关于c++ - C++标准中[dcl.constexpr] p5的原理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31683519/

10-14 07:13