变量的const constexpr修饰是否冗余?C++多版本等价性验证
关于constexpr与const在对象声明中的等价性问题
首先直接给你明确结论:是的,cppreference里提到的“对象声明”可以理解为任意变量声明,并且在C11、C14和C++17标准中,constexpr const int someConstant = 3;和constexpr int someConstant = 3;完全等价。
咱们来一步步拆解细节:
先搞懂“对象声明”的范围:在C++的标准术语里,“对象”指的是占据内存空间、用于存储值的实体,而变量就是最常见的对象形式(包括全局变量、局部变量、静态变量等)。所以这里的“对象声明”其实就是各种变量的声明场景。
为什么constexpr会隐含const属性?
constexpr的核心要求是对象必须是编译期可求值的常量,而编译期常量本身就自带“不可修改”的特性——毕竟编译阶段就确定的值,运行时肯定不能被改动。因此,当你给变量加上constexpr说明符时,编译器会自动为它附加const属性,不管你显式写不写const,最终变量的类型都是const int。跨标准版本的一致性:
从C11引入constexpr开始,对象声明中的constexpr隐含const的规则就没变过,C14和C17都延续了这个逻辑。唯一的例外是非静态成员函数(C14之前constexpr会隐含const,C++14之后允许constexpr修饰非const成员函数),但这和你问的对象声明场景无关。
举个实际的编译验证例子:
constexpr int a = 3; a = 5; // 编译错误,因为a本质是const int constexpr const int b = 3; b = 5; // 同样编译错误,两者效果完全一致
编译器会把这两个变量都当作const int类型处理,没有任何区别。
内容的提问来源于stack exchange,提问作者Pharap
相关产品推荐
相关产品推荐

