Примечание: Сначала прочитайте комментарии к этому. Йоханнес более или менее сбил весь мой аргумент одной удачной стандартной цитатой. ; -)
У меня нет стандарта C ++, поэтому мне нужно экстраполировать его из стандарта C.
Довольно удивительно (для меня) глава 6.2.1 Области применения идентификаторов ничего не говорит о сфере действия идентификатора, начиная с момента его объявления (как я бы догадался). int a
, в вашем примере, имеет область видимости блока, которая «заканчивается в конце соответствующего блока», и это все, что сказано об этом. глава 6.8.6.1 Оператор goto говорит, что "оператор goto не должен переходить из области видимости идентификатора, имеющего переменно измененный тип, в область видимости этого идентификатора" - но поскольку ваши goto
s перепрыгнуть только в пределах блока (и, таким образом, область действия int a
, что кажется приемлемым для ISO / IEC 9899: 1999.
Я довольно удивлен этим ...
Редактировать # 1: Быстрый Google, позже я получил окончательный вариант C ++ 0x. Соответствующее заявление, я думаю, таково здесь (6,7 Заявление декларации , выделив мое):
Можно перевести в блок, но не так, чтобы
обходит объявления с инициализацией .
Программа, которая прыгает с точки, где переменная с автоматическим
длительность хранения не входит в область действия до точки, где она находится в области действия
плохо сформирован , если переменная не имеет скалярного типа , тип класса с
тривиальный конструктор по умолчанию и тривиальный деструктор, cv-квалифицированный
версия одного из этих типов, или массив одного из
предыдущие типы и объявляются без инициализатора .
Я думаю, что ваш код в порядке по стандартам стандарта. Но неприятно, заметьте. ; -)
Редактировать # 2: Читая ваш комментарий о возможном уничтожении int a
из-за прыжка назад, я обнаружил это (6,6 операторов Jump , выделив мой):
Передача из цикла, из блока или обратно после инициализированной переменной
с автоматической продолжительностью хранения предполагает уничтожение объектов с
продолжительность автоматического хранения, находящаяся в области действия в точке, переданной из
не в точке, переведенной в.
Во-первых, int a
не "инициализирован" и не является объектом, если я правильно понимаю стандартную терминологию.