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的初始化
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)
在上面的,如果i是2一开始,你会打 x1.someOperation()之前,X x1这将构造对象.
如果允许编译,则会抛出运行时错误,具体取决于是否在2之前执行了case:1(并且构造了对象).因此,编译器不允许它.
Plain Old Data类型允许使用相同的内容,但不能使用用户定义的构造函数.