Почему так происходит
Потому что так написано в стандарте языка С++. Нельзя перепрыгивать через явно указанную или неявную, но необходимую, инициализацию локальных автоматических объектов. Откуда произрастает необходимость в таким ограничении должно быть очевидно. Понятно, что последствия препрыгивания через явно указанную инициализацию переменной типа
int могут показаться относительно нестрашными: переменная просто останется неинициализированной и мы всегда можем присвоить такой переменной конкретное значение позже. Но, например, перепрыгивание через инициализацию объекта с нетривиальной внутренней структурой и нетривиальным конструктором запросто приведет в существенно более катастрофическим и необратимым последствиям.
Кстати, это ограничение распространяется только на объекты с
автоматическим классом памяти. На локальные
статические объекты оно не распространяется, то есть вы при желании можете таки получить неинициализированный объект со всеми вытекающими
#include <iostream>
#include <string>
int main()
{
goto skip;
static std::string s;
skip:
std::cout << s[0] << std::endl;
}
Код:
23080 Segmentation fault (core dumped)
http://coliru.stacked-crooked.com/a/ab0582086fb89c80---
В С нет такого ограничения на прыжки через инициализацию, но там нет и классов с нетривиальным конструктором, то есть там последствия такого прыжка сведутся лишь к мусору в объектах фундаментальных типов. Однако, эта же логика присутствует в С в несколько другой ипостаси: запрет на прыжки через объявления, связанные с вариабельно-модифицируемыми (variably modified) типами, т.е. через VLA-типы
http://port70.net/~nsz/c/c11/n1570.html#6.8.4.2p2http://port70.net/~nsz/c/c11/n1570.html#6.8.6.1p1int main(void)
{
int n = 42;
goto skip;
typedef char A[n];
skip:;
}
Такая программа является ошибочной из-за прыжка через вариабельно-модифицируемый typedef
Код:
error: jump into scope of identifier with variably modified type
4 | goto skip;