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