关键字 constexpr 在引入 C++11 标准时对其函数施加了相当严格的限制。 C++14 和 C++20 放宽了这些限制(最值得注意):
return
语句、static_assert
等。try
和 asm
C++23 进一步软化了这些限制。从我在cppreference中看到的,函数的
constexpr
似乎只剩下以下含义:
C++23 甚至删除了 constexpr 函数必须在编译时对于 p2448r2 中的任何类型“可计算”的限制。根据我的理解,这完全消除了在编译时评估
constexpr
函数的想法。
是这样吗?如果是这样,
constexpr
函数还有用吗?
您实际上似乎在问:为什么不默认制作任何东西
constexpr
?
因为您可能希望其他人在编译时不要使用函数,以便您稍后可以切换到非 constexpr 实现。
想象一下:
您会看到一个库函数,您想在编译时使用它。
比方说,
size_t RequiredBufferSize();
。如果它恰好是 constexpr,您可以在堆栈上分配缓冲区,或者类似的东西。
你不确定它是否应该在编译时工作,因为我们想象的语言中没有
constexpr
。
你尝试一下,它确实在编译时起作用。你开始这样使用它。
假设实现是
{return 42;}
,即 constexpr
。
库的新版本发布,该函数在编译时不再起作用(例如,大小是从配置文件加载的)。
您向开发人员抱怨,他认为该函数从未打算在编译时工作,并且您依赖于实现细节。