5

我刚刚阅读了答案

const vs constexpr 变量

并且正在观看关于 C++11/14 特性的 Google 技术讲座,其中据说 constexpr 将来在函数方面可能不是必需的,因为编译器会不断发展以自行解决. 最后,我知道 Java 编译器和 JVM 努力找出类(或任何变量)在构造后是不可变的 - 无需您明确表示 - 并基于此事实进行各种邪恶的优化。

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

4

1 回答 1

7

不,任何一个都不会取代另一个,他们有不同的角色。Bjarne Stroustrup 在他的C++ FAQ中告诉我们 constexpr 不是 const 的替代品,并概述了每个特性的不同角色:

请注意, constexpr 不是 const 的通用替代品(反之亦然):

  • const 的主要功能是表达对象不通过接口修改的想法(即使对象很可能通过其他接口修改)。恰好声明一个对象const为编译器提供了极好的优化机会。特别是,如果一个对象被声明为const并且它的地址没有被占用,编译器通常能够在编译时评估它的初始化程序(尽管这不能保证)并将该对象保存在它的表中,而不是将它发送到生成的代码中.
  • constexpr 的主要功能是扩展编译时可以计算的范围,使这种计算类型安全。声明为constexpr的对象在编译时评估其初始化程序;它们基本上是保存在编译器表中的值,仅在需要时才发送到生成的代码中。
于 2015-01-08T22:46:12.993 回答