考虑以下代码:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC和Clang拒绝它,因为跳到bar:
会绕过变量初始化。MSVC根本没有抱怨(除了在bar:
后使用x
会引起警告)。
我们可以使用switch
进行类似的操作:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
现在所有三个编译器都会发出错误信息。
这些片段是不正确的吗?还是会导致未定义行为?
我曾经认为两者都是不正确的,但我找不到标准的相关部分。 [stmt.goto] 对此没有任何说明,[stmt.select]也是一样。
x
,那么问题会变得更加微不足道。 - Jarod42/permissive-
标志,它也会抱怨。但我不知道没有该标志的MSVC行为是否定义良好(我认为应该是这样,否则为什么允许它?)。 - walnut