在无法访问的语句中创建变量是否是明确定义的行为?

zne*_*eak 2 c++ memory switch-statement c++11

我有一个程序,其switch语句与此类似:

switch(n)
{
case 0:
    /* stuff */
    break;

    int foo;
case 1:
    foo = 5;
    break;
case 2:
    foo = 6;
    break;
}
Run Code Online (Sandbox Code Playgroud)

请注意int foo;之间case 0case 1.这句话是无法达到的:如果你完成了这个程序,你就永远不会跨过它.

这可以在没有警告或错误的情况下编译Clang,但是当我运行时它似乎被抬起(尽管这可能是由于其他原因).

在无法访问的语句中声明变量并在可达语句中使用它是否是明确定义的行为,它是否会起作用?

Ben*_*igt 5

只要变量具有简单的构造,它就是明确定义的行为,并且具有(大致)相同的效果,就好像在更大的范围内声明变量一样.

如果需要任何初始化,您将收到错误.

第6.7节说

可以转换为块,但不能以初始化绕过声明的方式.从一个点,具有自动存储持续时间的变量不是在范围上的点是在范围上跳跃的程序是非法的构造,除非变量具有标量类型,类型与平凡缺省构造和一个微不足道的析构函数,一个这些类型之一的cv限定版本,或者前面类型之一的数组,并且在没有初始化程序的情况下声明.

  • @RobertHarvey:为什么不呢?该段定义何时合法"跳过"变量声明并直接跳转到使用该变量的点,何时不是. (2认同)