Почему нормально прыгать в область действия объекта скалярного типа без инициализатора? - PullRequest
6 голосов
/ 16 декабря 2011

Когда я читаю стандарт C ++, кажется, что следующий код прекрасно работает в соответствии со стандартом.

int main() {
   goto lol;
   {
      int x;
lol:
      cout << x << endl;
   }
}

// OK

[n3290: 6.7 / 3]: можно перенести в блок, но не в способ обойти объявления с инициализацией. Программа, которая прыгает с точки, где переменная с автоматической продолжительностью хранения не входит в область до точки, в которой он находится в области действия, плохо сформирован , если только переменная имеет скалярный тип , тип класса с тривиальным значением по умолчанию конструктор и тривиальный деструктор, cv-квалифицированная версия одного из эти типы, или массив одного из предыдущих типов и объявляется без инициализатора .

Почему это должно работать? Разве все же не опасно перепрыгивать через его определение и использовать undefined x? И почему существование инициализатора должно иметь какое-либо значение?

Ответы [ 2 ]

7 голосов
/ 16 декабря 2011

Вы бы в любом случае использовали неинициализированный x, поскольку int x; настолько неинициализирован, насколько это возможно.Существование инициализатора, конечно, имеет значение, потому что вы его пропустите.Например, int x = 5; инициализирует x, поэтому, если вы перепрыгните через него или нет, будет иметь значение.

2 голосов
/ 16 декабря 2011

Разве все же опасно перепрыгивать через его определение и использовать неинициализированный x?

Но x все равно не будет инициализирован, потому что он был объявлен без инициализатора! Таким образом, goto может пропускать операторы присваивания, которые устанавливают (вроде-инициализировать) x, но неудивительно, что goto может пропускать операторы присваивания; и само объявление на самом деле ничего не делает , если только нет инициализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...