为什么这段代码可以正常运行
void foo(int i)
{
switch(i) {
case 1:
{
X x1;
break;
}
case 2:
X x2;
break;
}
}
而下面给出编译错误('x1' 的初始化被 'case' 标签跳过)?
void foo(int i)
{
switch(i) {
case 1:
X x1;
break;
case 2:
X x2;
break;
}
}
我知道使用大括号会引入一个新的范围,因此在我们找到它的左大括号之前不会为 x1 分配存储空间。但是 x2 仍然在 case 标签内初始化,没有用大括号括起来。这不应该也是一个错误吗?
我认为可以在两个代码片段中有条件地跳过 x2 的初始化
最佳答案
1:有效
case 1:
{
X x1;
break;
}
如果不符合条件,x1
不能被任何进一步的语句使用,因此不会有运行时错误。 x1
不会尝试存在于大括号之外。
2:无效
switch(i) {
case 1:
X x1; //don't break
i = 2;
...
...
...
case 2:
x1.someOperation()
}
在上面,如果i
是2
最初,您会点击 x1.someOperation()
之前 X x1
这将构造对象。
如果允许编译,它是否会抛出运行时错误,这取决于 case:1 是否在 2 之前执行,(对象是建)。因此,编译器不允许它。
不能具有用户定义的构造函数的普通旧数据类型也是如此。
关于c++ - 开关中的条件初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13415752/