【发布时间】: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 是一个表达式,其值在编译时已知,而不是在运行时初始化的变量。它们是两个不同的概念。
-
这似乎假设
const和constexpr(仅)关于优化。它不是。尤其是constexpr,这是一个可移植性帮助:规范确保每个 符合C++ 编译器必须能够在编译时计算值。 (从程序员的角度来看:您可以在需要常量表达式的地方使用那些值。)这可能也是我们从相对受限的常量表达式开始并获得更多放松的原因。
标签: c++ c++11 constants constexpr compile-time-constant