这个问题在这里已经有了答案:
Why do we need to mark functions as constexpr?
(4 个回答)
9 个月前关闭。
据我所知, constexpr 可以被视为编译器的提示,以检查是否可以在编译时评估给定的表达式,并在可能的情况下进行评估。
我知道它也对声明为 constexpr 的函数或初始化施加了一些限制,但最终目标是编译时评估,不是吗?
所以我的问题是,为什么我们不能把它留给编译器呢?它显然能够检查前置条件,那么为什么它不对每个表达式进行检查并在可能的情况下在编译时进行评估呢?
关于为什么会这样,我有两个想法,但我还不确定它们是否达到了目的:
a) 在编译期间可能需要太长时间。
b) 由于我的代码可以在不允许 normale 函数的位置使用 constexpr 函数,因此说明符也是声明的一部分。如果编译器自己完成所有事情,则可以使用 C 数组定义中的函数和该函数的一个版本,但在下一版本中可能会出现编译器错误,因为编译时评估的前提条件是不比较满意。
最佳答案
constexpr
不是对编译器的任何“提示”; constexpr
是一个要求。它不需要在编译时实际执行表达式;它要求它可以。
什么 constexpr
do(对于函数)是限制您可以放入函数定义中的内容,以便编译器可以在编译时尽可能轻松地执行该代码。这是程序员和编译器之间的契约。如果你的函数违反了约定,编译器会立即出错。
契约(Contract)建立后,您现在可以使用这些 constexpr
在语言需要编译时常量表达式的地方使用函数。然后,编译器可以检查常量表达式的元素,以查看表达式调用 constexpr
中的所有函数调用。职能;如果他们不这样做,则会再次导致编译器错误。
您试图将其隐藏起来会导致两个问题。首先,如果没有语言定义的明确契约,我怎么知道在 constexpr
中我可以做什么,不能做什么?功能?我怎么知道什么会使函数不是 constexpr
?
其次,在编译器中没有契约(Contract)的情况下,通过声明我的意图来创建函数 constexpr
,编译器如何能够验证我的函数符合该契约?它不能;它必须等到我在常量表达式中使用它之后才发现它实际上不是一个正确的 constexpr
功能。
契约(Contract)最好明确并预先说明。
关于c++ - 为什么 constexpr 不是自动的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660036/