switch-case语句中的变量声明

时间:2016-07-13 05:33:19

标签: c++ switch-statement variable-declaration

switch - case语句中的变量声明问题已在this SO post中得到充分讨论,答案涵盖了大多数方面。但我遇到了一个问题,因为我找不到可靠的理由。有人可以解释一下这段代码有什么问题吗?

switch (var)
{
case 0:
    int test;
    test = 0;   // no error
    int test2 = 0;  // ERROR: initialization of 'test2' is skipped by 'case' label
    std::string str;
    str = "test";   // ERROR: initialization of 'str' is skipped by 'case' label
    break;
case 1:;
    break;
}

我知道为什么第6行会导致错误。但接下来的两条线有什么问题?我认为这可能与本机类型和类类型之间的区别有关,但我不确定。

这不是Why can't variables be declared in a switch statement?的重复问题!因为我提供了原始链接。请阅读这两个问题并注意区别。 AFAIK,问题未在原始问题中讨论。

1 个答案:

答案 0 :(得分:1)

  

可以转换为块,但不能以初始化绕过声明的方式。一个   程序从具有自动存储持续时间的变量不在范围内的点跳转到90   除非变量具有标量类型,具有普通默认值的类类型,否则它在范围内的点是不正确的   构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组   在没有初始化器(8.5)的情况下声明前面的类型。

([stmt.dcl] / 3)

直观的解释是,如果它执行的初始化实际上是无操作,则只能跳过声明。如果提供了值,则不能跳过它。如果类的构造函数中有任何代码,则不能跳过它。