C++中变量初始化时std::is_constant_evaluated返回false的原因是什么?
关于
std::is_constant_evaluated返回值的规范解释 你对[expr.const]/2注释的理解存在偏差,注释描述的场景和你给出的测试代码场景有本质区别,规范文本和注释不存在冲突:
- 注释的适用前提是变量的初始化全表达式需要被作为常量表达式解释,这类场景本身就属于规范明确要求常量求值的上下文,不是所有变量初始化都会触发该逻辑。
- 你给出的测试代码中,自动存储期变量
x既没有被声明为constexpr,也没有常量初始化的强制要求:自动变量默认不会执行常量初始化,它的初始化器本来就不需要在编译期作为常量表达式求值,自然不会进入注释描述的求值上下文,std::is_constant_evaluated()返回false,程序返回0完全符合规范。
可以参考下述对比代码理解两种场景的差异:
#include <type_traits> // 属于常量求值上下文,std::is_constant_evaluated()返回1 constexpr int y = std::is_constant_evaluated(); int main() { // 不属于常量求值上下文,std::is_constant_evaluated()返回0 int x = std::is_constant_evaluated(); return x + y; // 程序运行返回1 }
[expr.const]/14明确规定
std::is_constant_evaluated()仅在显式常量求值上下文返回true,其中第五项规则的适用前提是「可在常量表达式中使用的变量的初始化器,或执行常量初始化的变量的初始化器」,你代码中的x完全不满足该前提,因此触发返回false的逻辑。
内容的提问来源于stack exchange,提问作者Brian Bi
相关产品推荐
相关产品推荐

