const 和 constexpr 最终会是一回事吗?

Will const and constexpr eventually be the same thing?

本文关键字:一回事 constexpr const      更新时间:2023-10-16

我刚刚读到了答案

常量与变量

上的常量与康特克斯PR

并且正在观看这个关于 C++11/14 功能的谷歌技术谈话 ,其中据说,好吧,将来在函数方面可能不需要 constexpr,因为编译器会发展到自己弄清楚。最后,我知道Java编译器和JVM努力找出类(或任何变量)在构造后是不可变的 - 没有你明确说明 - 并基于这一事实进行各种邪恶的优化。

所以,问题来了:const 和 constexpr 的命运最终会是一回事吗?也就是说,即使编译器不能保证进行运行时初始化等,它最终不会尽可能(基本上)这样做吗?当这种情况发生时,其中一个关键字不是多余的吗?(就像内联正在成为一样,也许)?

不,两者都不会取代另一个,它们有不同的角色。Bjarne Stroustrup在他的C++常见问题解答中告诉我们,constexpr不能替代const,并概述了每个功能的不同角色:

请注意,constexpr 不是 常量(反之亦然):

  • const 的主要功能是表达这样一种想法,即对象不会通过接口进行修改(即使该对象很可能是 通过其他接口修改)。碰巧的是,声明 对象常量为 编译器。特别是,如果一个对象被声明为 const 及其 地址不被获取,编译器通常能够评估其 编译时的初始值设定项(尽管不能保证)并保持 该对象在其表中,而不是将其发射到生成的 法典。
  • Constexpr的主要功能是扩展编译时可以计算的范围,使这种计算类型安全。对象 声明的 constexpr 在编译时评估其初始值设定项; 它们基本上是保存在编译器表中的值,并且仅 如果需要,发出到生成的代码中。