为何用const变量初始化constexpr变量的代码可正常编译?
为什么const变量可以初始化constexpr变量?
你的代码能正常编译完全符合C++标准,核心原因是用常量表达式初始化的const变量本身就是一个常量表达式,可以在编译期确定值。
先明确两个关键字的核心差异:
const的本质是“只读”,它不强制要求变量值在编译期确定,但如果它是用编译期可求值的表达式(比如字面量、constexpr变量、编译期可计算的表达式)初始化的,那么这个const变量就具备了编译期常量的属性,属于标准定义的“常量表达式”。constexpr的要求是“必须在编译期完成求值”,所以初始化它的表达式必须是常量表达式。
回到你的代码:
const int var1 = 2;中,var1是用字面量2(编译期确定的常量)初始化的const变量,编译器可以明确知道它的值在整个程序生命周期中不会改变,且编译期就能确定具体数值,因此它完全满足constexpr变量对初始化表达式的要求,所以constexpr int var2 = var1 * 5;是合法的。反例:如果const变量用运行时才能确定的值初始化,比如:
const int var1 = rand(); // rand()是运行时生成随机数 constexpr int var2 = var1 *5; // 编译器会报错,因为var1不是常量表达式关于编译器兼容性:
这是C11及以后标准明确规定的行为,并非GCC独有。只要是符合C11+标准的编译器(如Clang、MSVC),都会支持这种写法,不会出现行为差异。
内容的提问来源于stack exchange,提问作者Mihai
相关产品推荐
相关产品推荐

