const 和 constexpr 最终会是一回事吗?
Will const and constexpr eventually be the same thing?
我刚刚读到了答案
常量与变量上的常量与康特克斯PR
并且正在观看这个关于 C++11/14 功能的谷歌技术谈话 ,其中据说,好吧,将来在函数方面可能不需要 constexpr,因为编译器会发展到自己弄清楚。最后,我知道Java编译器和JVM努力找出类(或任何变量)在构造后是不可变的 - 没有你明确说明 - 并基于这一事实进行各种邪恶的优化。
所以,问题来了:const 和 constexpr 的命运最终会是一回事吗?也就是说,即使编译器不能保证进行运行时初始化等,它最终不会尽可能(基本上)这样做吗?当这种情况发生时,其中一个关键字不是多余的吗?(就像内联正在成为一样,也许)?
不,两者都不会取代另一个,它们有不同的角色。Bjarne Stroustrup在他的C++常见问题解答中告诉我们,constexpr不能替代const,并概述了每个功能的不同角色:
请注意,constexpr 不是 常量(反之亦然):
- const 的主要功能是表达这样一种想法,即对象不会通过接口进行修改(即使该对象很可能是 通过其他接口修改)。碰巧的是,声明 对象常量为 编译器。特别是,如果一个对象被声明为 const 及其 地址不被获取,编译器通常能够评估其 编译时的初始值设定项(尽管不能保证)并保持 该对象在其表中,而不是将其发射到生成的 法典。
- Constexpr的主要功能是扩展编译时可以计算的范围,使这种计算类型安全。对象 声明的 constexpr 在编译时评估其初始值设定项; 它们基本上是保存在编译器表中的值,并且仅 如果需要,发出到生成的代码中。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用strcpy将char数组的元素复制到另一个数组
- 为什么对于gcc来说,"UNIX"和"unix"宏不是一回事?
- 为什么 #pragma 一次不防范多个非 constexpr 定义?
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 是否有一种非间接、非黑客的方式来保证 constexpr 函数仅在编译时可调用?
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- constexpr检查一种类型
- 如何以静态方式使用另一个 constexpr 数组初始化一个数组
- 将 constexpr 数组扩展为一组非类型模板参数
- C++中的"derived"与Java中的"extended"是一回事吗?
- 部分模板专用化可能不适用于函数,但重载不是一回事吗?
- C++14我应该多久使用一次constexpr
- 抽象类与基类是一回事吗?
- const 和 constexpr 最终会是一回事吗?
- 一台计算机中出现 msvs 2013 错误 C2057,另一台计算机中没有错误。这是怎么回事?
- Std::hash_set和Std::unordered_set是一回事吗?
- 在c++ 11或更高版本中,是否有一种方法可以让constexpr在没有UB的情况下确定endian ?
- 如何确保在constexpr函数中接受一个数组,该数组以null结束
- 抽象方法和纯虚拟函数是一回事吗