注意:首先阅读对此的评论。约翰内斯或多或少地用一句恰如其分的标准引语否定了我的整个论点。;-)
我没有可用的 C++ 标准,所以我必须从 C 标准推断。
令人惊讶的是(对我来说),第 6.2.1 章标识符的范围没有说明从声明点开始的标识符的范围(正如我猜想的那样)。int a
,在您的示例中,具有块范围,它“在关联块的末尾终止”,这就是关于它的全部内容。第 6.8.6.1 章goto 语句说“goto 语句不应从具有可变修改类型的标识符的范围之外跳转到该标识符的范围内” - 但因为您goto
的 s 仅在块内跳转(并且,因此,就 ISO/IEC 9899:1999 而言int a
,的范围似乎没问题。
我对此感到非常惊讶...
编辑#1:稍后我快速搜索了一下 C++0x 最终草案。我认为相关的声明是这里(6.7声明声明,突出显示我的):
可以转移到一个块中,但不能以一种绕过初始化声明的方式。除非变量具有标量类型、具有普通默认构造函数和普通析构函数的类类型、以及这些类型之一的 cv 限定版本,或上述类型之一的数组,并且在没有初始化器的情况下声明。
我认为您的代码符合标准的标准。但屁股丑陋,请注意。;-)
编辑#2:阅读您关于int a
由于向后跳转而可能破坏的评论,我发现了这一点(6.6 Jump statements,突出显示我的):
转移出循环、转移出块或返回具有自动存储持续时间的初始化变量
涉及销毁具有自动存储持续时间的对象,这些对象在转移点的范围内但不在转移点的范围内。
一,int a
不是“初始化”,如果我正确理解标准术语,它不是对象。