【发布时间】:2015-07-28 17:43:41
【问题描述】:
[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; }
main 中的表达式格式正确但无用。一些编译器无论如何都会以警告的形式发出诊断消息(并且允许它们)。
我知道 [dcl.constexpr]p5 不需要诊断,所以我不问这个。我只是问为什么这个规则甚至在标准中。
【问题讨论】:
-
这样实现就可以根据需要诊断一个 never-constexpr 函数,但不必特意去做。类似于模板的早期检查。
-
请在您的问题中包含措辞,链接可能会失效,然后问题就不如参考有用。
-
@T.C Implementations 可以诊断他们想要的任何东西,无需特殊许可。
标签: c++ function language-lawyer constexpr