为何无法在switch非末尾case中初始化constexpr变量?
为什么switch非末尾case中初始化constexpr变量会报错?
你遇到的错误和constexpr本身无关,核心原因是switch语句的作用域和跳转特性:
switch的所有case共享同一个作用域,case标签只是跳转标记,不是作用域边界。哪怕是
constexpr变量,它的声明(包括初始化)依然会在运行时进入对应case时创建变量实体——C++绝不允许程序跳过变量的初始化语句,却进入该变量的作用域(比如从case 1直接跳转到case 3时,z的初始化被跳过,但它的作用域覆盖到switch结束前的所有代码)。constexpr只是保证变量的值在编译期确定,或者能被编译期求值,但它仍然是一个有生命周期的变量实体。编译器不会因为它是constexpr就放宽“不能跳过初始化”的规则——只要变量在case中直接初始化(没被花括号包裹成独立块),不管是不是constexpr,都会触发这个“crosses initialization”错误。
解决方法
给case 2的代码加上花括号,将z的作用域限制在独立块内,这样跳转就不会涉及到未初始化的变量:
case 2: { constexpr int z{4}; // 编译通过 break; }
你的测试代码
#include <iostream> int main() { switch (1) { int y; case 1: y = 4; break; case 2: constexpr int z{ 4 }; // ERROR break; case 3: y=5; break; } return 0; }
内容的提问来源于stack exchange,提问作者Akshay J R
相关产品推荐
相关产品推荐

