Kiedy czytam standard C++, wygląda na to, że poniższy kod jest idealnie zgodny z normą.Dlaczego można wskoczyć w zakres obiektu typu skalarnego bez inicjalizatora?
int main() {
goto lol;
{
int x;
lol:
cout << x << endl;
}
}
// OK
[n3290 6.7/3] Możliwe jest przeniesienie na blok, a nie w sposób, który omija zgłoszeń z inicjalizacji. Program, który skacze od punktu, w którym zmienna z automatycznym okres przechowywania jest nie w zakresie do punktu, gdzie jest zasięg jest źle sformułowane chyba zmienna ma skalarnego typu, typ klasy z trywialny domyślny konstruktora i trywialny destruktor, wersja z kwalifikacjami cv jednego z tych typów lub tablica jednego z poprzednich typów i jest zadeklarowana jako bez inicjalizatora.
Dlaczego to powinno działać? Czy nie jest jeszcze niebezpiecznie przeskakiwać jego definicję i używać undefined x
? I dlaczego istnienie inicjalizatora ma jakieś znaczenie?
Ale problem polega na tym, że niezależnie od inicjalizatora, x nie jest zdefiniowany, ponieważ jego definicja i tak jest pomijana. Czyż nie? –
@EricZ: Definicja nadal występuje. 'goto' jest działaniem wykonawczym, pomija tylko zachowanie środowiska wykonawczego, takie jak inicjalizacja. – GManNickG
@GMan, zgadza się! Dzięki;) –