c++ - c++ 标准中 [dcl.constexpr]p5 的基本原理

标签 c++ function language-lawyer constexpr

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

For a non-template, non-defaulted constexpr function or a non-template, non-defaulted, non-inheriting constexpr constructor, if no argument values exist such that an invocation of the function or constructor could be an evaluated subexpression of a core constant expression ([expr.const]), or, for a constructor, a constant initializer for some object ([basic.start.init]), the program is ill-formed; no diagnostic required.

如果一个程序违反了这个规则,声明违规函数 constexpr 是没有用的。所以呢?接受声明说明符 constexpr 的无用使用而不是触发未定义的行为(不需要诊断)不是更好吗?除了未定义行为的问题之外,我们还面临标准中包含规则 [dcl.constexpr]p5 的额外复杂性。

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

int main() { 0; }

main 中的表达式格式正确但无用。一些编译器无论如何(并且允许)以警告的形式发出诊断消息。

我知道 [dcl.constexpr]p5 不需要诊断,所以我不是问这个。我只是问为什么这个规则甚至在标准中。

最佳答案

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

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

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

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

相关文章:

c++ - 在 C++ 中使用临时对象作为默认参数是否安全?

c++ - 如何通过取消引用内存中的另一个地址来取消引用内存中的特定地址?

javascript - 为什么这个 JavaScript 函数对同一查询返回两个不同的结果?

php - 将一个 Div 包裹在两个 Div 周围,这是一个使用 PHP 的 Wordpress 函数

css - 在显示/隐藏的 div 上触发缩放功能。

c++ - *&++i 会在 C++03 中导致未定义的行为吗?

c++ - 什么时候 `this` 是右值?

c++ - 我如何与扩展的 QQuickItem 中的模型交互?

c++ - 我如何将 std::vector<short>& samples2 转换为 kiss_fft_scalar* 样本?

c++ - 使用 std::function 和 std::bind 来存储回调和处理对象删除。