[dcl.constexpr] p5(http://eel.is/c++draft/dcl.constexpr#5)的基本原理是什么?
对于非模板,非默认的constexpr函数或a 非模板,非默认,非继承constexpr构造函数,if 没有参数值,以便调用函数或 构造函数可以是核心常量的计算子表达式 expression([expr.const]),或者,对于构造函数,一个常量 某个对象的初始化程序([basic.start.init]),程序是 形成不良;无需诊断。
如果程序违反此规则,则声明违规函数constexpr是无用的。所以呢?接受无用的decl-specifier constexpr而不是触发未定义的行为(不需要诊断)是不是更好?除了未定义行为的问题之外,我们还有在标准中使用规则[dcl.constexpr] p5的额外复杂性。
在某些情况下,实现仍然可以提供有用的诊断消息(按惯例警告)。就像下面的情况一样:
int main() { 0; }
主要表达形式良好但无用。有些编译器会以警告的形式发出诊断消息(并允许它们)。
我知道[dcl.constexpr] p5不需要诊断,所以我不是在问这个问题。我只想问为什么这个规则甚至在标准中。
答案 0 :(得分:2)
它形成不良的原因是因为使其形成不良允许实现拒绝不能形成常量表达式的constexpr
函数定义。及早拒绝它们意味着获得更有用的诊断。
不需要诊断的原因是因为实现确定对于每个可能的参数组合,结果不是常量表达式可能是不现实的。
事实上,形成不良,不需要诊断,实际上意味着使行为不明确的事情在我看来好像很不幸,但仅仅因缺乏更好的选择而被选中。如果意图实际上是允许任意运行时行为,我会非常惊讶,但是对于C ++中的任何语言特性,没有“可能被诊断为错误,但如果没有,必须按照指定行事”的概念