【发布时间】:2023-01-23 23:53:33
【问题描述】:
关键字 constexpr 在将其引入 C++11 标准时对函数实施了非常严格的限制。 C++14 和 C++20 放宽了这些限制(最值得注意的):
- C++14 允许多个
return语句、static_asserts 等。 - C++20 允许
try和asm
C++23 进一步放宽了这些限制。从我在cppreference中看到的,函数的constexpr似乎只剩下以下含义:
- 不能是协程
- 对于构造函数和析构函数,该类必须没有虚拟基类
- 对于类模板的constexpr函数模板和constexpr成员函数,至少有一个特化必须满足上述要求。
C++23 甚至删除了 p2448r2 中的任何类型的 constexpr 函数在编译时必须是“可评估的”的限制。根据我的理解,这完全消除了在编译时评估 constexpr 函数的想法。
是吗?如果是这样,constexpr 函数还有什么用?
【问题讨论】:
-
它可以在编译时评估吗?
-
@user253751 给定“as-if”子句,none constexpr 函数也可以。另见 p2448r2:open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html
-
实际上,如果你的函数是 constexpr 那么编译器会承诺它将要如果可能的话,在编译时对其进行评估,否则它只会做出微弱的尝试。这是语言律师的问题吗?
-
不要再认为
constexpr限制指定了一组功能,它已被更大的一组所取代。所做的更改没有使任何用户提供的函数constexpr没有被程序员标记。相反,constexpr关键字定义了一组函数,并且语言更改放宽了对如何在内部实现这些函数的限制。 -
我想你的意思是要问:为什么我们仍然需要将函数注释为
constexpr,而不是“constexpr函数有什么用?” (显而易见的答案是:在编译时评估代码非常有用?)
标签: c++ constexpr c++23 constexpr-function