gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:23:02 25 4
gpt4 key购买 nike

[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com