Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const和constexpr最终会是同一件事吗?_C++_C++11_Constants_Constexpr_Compile Time Constant - Fatal编程技术网

C++ const和constexpr最终会是同一件事吗?

C++ const和constexpr最终会是同一件事吗?,c++,c++11,constants,constexpr,compile-time-constant,C++,C++11,Constants,Constexpr,Compile Time Constant,我刚读了你的答案 我在看这篇文章,其中有人说,在函数方面,constexpr在将来可能是不必要的,因为编译器将自行开发。最后,我知道Java编译器和JVM努力工作,以确定类(或任何变量)在构建后是不可变的——没有明确说明——并基于这一事实进行各种邪恶的优化 所以,问题是:const和constexpr的命运最终会是一样的吗?也就是说,即使编译器不能保证执行运行时初始化等操作,它最终是否会尽可能(基本上)执行这些操作?当这种情况发生时,其中一个关键词不是多余的吗?(就像内联正在成为,也许)?不,

我刚读了你的答案

我在看这篇文章,其中有人说,在函数方面,constexpr在将来可能是不必要的,因为编译器将自行开发。最后,我知道Java编译器和JVM努力工作,以确定类(或任何变量)在构建后是不可变的——没有明确说明——并基于这一事实进行各种邪恶的优化


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

不,两者都不会取代另一个,它们有不同的角色。Bjarne Stroustrup在他的文章中告诉我们,constexpr不是const的替代品,并概述了每个功能的不同角色:

请注意,constexpr不是通用的 常数(反之亦然):

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

一、 首先,如果编译器不能在编译时执行我希望它执行的操作,我经常使用constexpr来获得一个干净而硬的错误。我宁愿知道什么时候有问题,也不愿默默地“修复”。别这么认为-获取
const
变量的地址是完全有效的,但不是
constexpr
one@RedAlert,可以不出现任何问题
constexpr int i=10;我不能肯定这件事。constexpr是一个在编译时已知其值的表达式,而不是在运行时初始化的变量。它们是两个不同的概念。这似乎假设
const
constepr
是(仅)关于优化的。事实并非如此。特别是 CONTXPRPR <代码>,这是一个便携性的帮助:规范确保每个符合C++编译器的编译器都必须能够在编译时计算值。(从程序员的角度来看:您可以在需要常量表达式的地方使用这些值。)这可能也是我们从相对受限的常量表达式开始并获得更多松弛的原因。