Cuando estoy leyendo el estándar C++, parece que el siguiente código está perfectamente bien de acuerdo con el estándar.¿Por qué está bien saltar al alcance de un objeto de tipo escalar sin un inicializador?
int main() {
goto lol;
{
int x;
lol:
cout << x << endl;
}
}
// OK
[n3290: 6,7/3]: es posible transferir en un bloque, pero no de una manera que no pasa por las declaraciones de inicialización. Un programa que salta de un punto en una variable con el tiempo de almacenamiento automático es no alcance a un punto en que es en su alcance está enfermo formó-menos que la variable tiene escalar tipo, tipo de clase con un trivial predeterminado constructor y un destructor trivial, una versión cv-calificada de uno de los tipos , o una matriz de uno de los tipos anteriores y se declara sin un inicializador.
¿Por qué debería funcionar? ¿No es peligroso saltar sobre su definición y usar el x
indefinido? ¿Y por qué la existencia de un inicializador debería marcar la diferencia?
Pero el problema es que, independientemente de que haya un inicializador, x no se define porque su definición se pasa por alto de todos modos. ¿No es así? –
@EricZ: la definición todavía ocurre. 'goto' es algo del tiempo de ejecución, solo omite el comportamiento del tiempo de ejecución, como la inicialización. – GManNickG
@GMan, ¡Bien! Gracias;) –