2016-07-13 255 views
0

switch - case语句中的变量声明问题在this SO post中有详细讨论,答案涵盖了大多数方面。但是我遇到了一个问题,因为我找不到一个坚实的理由。有人能解释这个代码有什么问题吗?switch-case语句中的变量声明

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

可以将其转换为块,但不能以绕过具有初始化的声明的方式。是形成不良的甲 程序,它从一个点,具有自动存储持续时间的变量不是对范围的一个 点它是在范围跳跃90,除非该变量具有标量类型,类型与平凡缺省 构造和琐碎的析构函数,这些类型中的一个的CV-合格版本,或 前述类型之一的阵列,并且被声明没有初始化(8.5)。

([stmt.dcl]/3)

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

+0

因此我可以断定,如果没有代码在类的构造函数,我的代码不会给任何错误? –

+0

@polfosol准确地说,默认的构造函数和析构函数必须是“小巫见大巫”,作为标准说。见http://en.cppreference.com/w/cpp/language/destructor#Trivial_destructor和http://en.cppreference.com/w/cpp/language/default_constructor#Trivial_default_constructor – Brian