gpt4 book ai didi

c++ - 开关中的条件初始化

转载 作者:可可西里 更新时间:2023-11-01 16:34:40 25 4
gpt4 key购买 nike

为什么这段代码可以正常运行

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()

}

在上面,如果i2最初,您会点击 x1.someOperation()之前 X x1这将构造对象。

如果允许编译,它是否会抛出运行时错误,这取决于 case:1 是否在 2 之前执行,(对象是建)。因此,编译器不允许它。


不能具有用户定义的构造函数的普通旧数据类型也是如此。

关于c++ - 开关中的条件初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13415752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com