C++中为何const变量x无法赋值给constexpr类型的变量c2?
问题分析
首先贴出完整代码片段:
const double x = 65; constexpr double x1 = 65; const char x2 = 'A1'; // 合法 constexpr char c1 = x1; constexpr double c3 = x2; // 非法 constexpr char c2 = x;
核心原因
constexpr变量要求初始化值必须是编译期可确定的常量表达式,三个赋值操作的合法性差异本质是等号右侧的变量是否符合「编译期常量」的要求:
- 关于非法的
constexpr char c2 = x:x是const double类型,C++标准中只有用常量表达式初始化的const整型/枚举类型,才能被当作编译期常量使用。浮点类型的const变量即使初始值是字面量,也不具备编译期常量属性,无法作为constexpr变量的初始化值,因此该语句非法。 - 关于合法的
constexpr char c1 = x1:x1本身是constexpr修饰的变量,它的值在编译阶段就已经固定,天然满足常量表达式要求,因此可以用来初始化constexpr变量。 - 关于合法的
constexpr double c3 = x2:x2是const char类型,属于整型范畴,且初始值是字面量常量表达式,符合const整型可作为编译期常量的规则,因此它的值编译期可确定,可以用来初始化constexpr变量。
补充说明:x2的初始化值'A1'属于多字符字面量,实际取值由编译器实现定义,但这一点不影响它属于编译期常量的属性,因此不会破坏x2的常量性。
内容的提问来源于stack exchange,提问作者Jitu DeRaps
相关产品推荐
相关产品推荐

