交换机中的条件初始化

pat*_*fox 9 c++ initialization switch-statement

为什么这段代码片段运行正常

void foo(int i)
{
    switch(i) {
    case 1:
    {
        X x1;
        break;
    }
    case 2:
        X x2;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

而以下给出了编译错误('case'标签跳过'x1'的初始化)?

void foo(int i)
{
    switch(i) {
    case 1:
        X x1;
        break;
    case 2:
        X x2;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道使用大括号引入了一个新的范围,因此在我们打开它的开头大括号之前,不会为x1分配存储空间.但x2仍然在一个案例标签内初始化,没有括号.这不是一个错误吗?

我认为在两个代码片段中都可以有条件地跳过x2的初始化

Ani*_*han 7

1:有效

 case 1:
        {
        X x1;
        break;
        }
Run Code Online (Sandbox Code Playgroud)

如果它没有达到条件,x1 则不能被任何进一步的语句使用,因此不会出现运行时错误.x1不会试图在牙箍外面存在.


2:无效

 switch(i) {
    case 1:
        X x1; //don't break
        i = 2;
        ...
        ...
        ...
     case 2:
        x1.someOperation()

 }
Run Code Online (Sandbox Code Playgroud)

在上面的,如果i2一开始,你会打 x1.someOperation()之前,X x1这将构造对象.

如果允许编译,则会抛出运行时错误,具体取决于是否在2之前执行了case:1(并且构造了对象).因此,编译器不允许它.


Plain Old Data类型允许使用相同的内容,但不能使用用户定义的构造函数.