От этого FAQ: What are Aggregates and PODs and how/why are they special?стручков и правила Готы
У нас есть эта часть:
Готы заявление. Как вы, возможно, знаете, это незаконно (компилятор должен выпустить ошибку), чтобы совершить переход через goto из точки, где какая-то переменная еще не была в области до точки, где она уже находится в области видимости. Это ограничение применяется только в том случае, если переменная имеет тип не-POD. В следующем примере f() плохо сформировалось, тогда как g() хорошо сформировалось. Обратите внимание, что компилятор Microsoft слишком либеральен с этим правилом - просто выдает предупреждение в обоих случаях.
int f() {
struct NonPOD { NonPOD(){}};
goto label;
NonPOD x;
label:
return 0;
}
int g(){
struct POD {int i; char c;};
goto label;
POD x;
label:
return 0;
}
Я хотел бы понять, почему разница? Похоже, что возможно, что даже если POD , объявленный после goto, он уже инициализирован, и ничего больше не нужно делать, тогда как не-POD не инициализируется. Или я лаяю неправильное дерево?
Так что означает, что в случае POD инициализация уже выполнена, но в случае, отличном от POD, это не было сделано. –
POD не может иметь ctor - это одно из требований. Но я думаю, что если вы использовали {} init, это тоже потерпит неудачу. –
Ну, конструктор неявный и должен быть запущен в какой-то момент. Переход не может перепрыгнуть через инициализацию, поэтому POD должен быть инициализирован. Я пытаюсь выяснить, когда это произойдет. –