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

标签 c++ initialization switch-statement

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

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/

相关文章:

c++ - 这个简单的例子被认为是 RAII

c++ - 为什么我不能初始化 WNDCLASSEX wc?

C# 程序卡住在整数列表上

JavaScript 约定 : switch statement in object constructor

c++ - char(*)[20] 与 char(*Object::variable)[20] 有何不同?

c++ - Objective-C @class/import 最佳实践

c - 变量不改变c

java - 类似工厂的图案,带 Spring bean ,没有开关盒

java - 非最终变量如何成为开关常量?

c++ - 构建 shell - IO 问题