【问题标题】:Will const and constexpr eventually be the same thing?const 和 constexpr 最终会是同一个东西吗?
【发布时间】:2015-01-08 22:16:02
【问题描述】:

我刚刚看了答案

const vs constexpr on variables

并且我正在看这个Google Tech Talk about C++11/14 features,其中说,在函数方面,未来可能不需要 constexpr,因为编译器会进化到自己解决这个问题。最后,我知道 Java 编译器和 JVM 会努力找出类(或任何变量)在构造后是不可变的 - 无需您明确表示 - 并基于此事实进行各种邪恶的优化。

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

【问题讨论】:

  • 我,一方面,如果编译器在编译时不能做我想让它做的事情,我会经常使用 constexpr 来得到一个干净而硬的错误。我宁愿知道什么时候出现问题,也不愿默默地“修复”它。
  • 不这么认为——获取const变量的地址是完全有效的,但不是constexpr一个
  • @RedAlert,可以毫无问题地做到constexpr int i = 10; cout << &i << endl;。变量有一个地址。使用 g++/clang++ -pedantic 编译
  • 对此我不确定。 constexpr 是一个表达式,其值在编译时已知,而不是在运行时初始化的变量。它们是两个不同的概念。
  • 这似乎假设constconstexpr (仅)关于优化。它不是。尤其是constexpr,这是一个可移植性帮助:规范确保每个 符合C++ 编译器必须能够在编译时计算值。 (从程序员的角度来看:您可以在需要常量表达式的地方使用那些值。)这可能也是我们从相对受限的常量表达式开始并获得更多放松的原因。

标签: c++ c++11 constants constexpr compile-time-constant


【解决方案1】:

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

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

  • const 的主要功能是表达对象不通过接口修改的想法(即使对象很可能是 通过其他接口修改)。碰巧的是,声明 对象 const 为 编译器。特别是,如果一个对象被声明为 const 并且它的 不占用地址,编译器通常能够评估其 编译时的初始化程序(尽管不能保证)并保持 该对象在其表中,而不是将其发送到生成的 代码。
  • constexpr 的 主要功能是扩展编译时可计算的范围,使此类计算类型安全。对象 声明的 constexpr 在编译时评估其初始化程序; 它们基本上是保存在编译器表中的值,并且仅 如果需要,发送到生成的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多