2011-12-16 11 views
6

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?

Respuesta

7

De todos modos, utilizaría un x sin inicializar, ya que int x; está tan sin inicializar como se va a obtener. La existencia de un inicializador hace, por supuesto, una diferencia, porque te lo saltearías. int x = 5;, por ejemplo, inicializa x, por lo que haría una diferencia si saltó sobre él o no.

+0

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í? –

+0

@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

+0

@GMan, ¡Bien! Gracias;) –

2

¿No es peligroso saltar sobre su definición y utilizar x sin inicializar?

¡Pero x no se inicializaría de todos modos, ya que se declaró sin un inicializador! Por lo tanto, es posible que el goto omita las declaraciones de asignación que establecen (ordenar-de-inicializar) x, pero no sorprende que goto pueda saltear declaraciones de asignación; y la declaración en sí misma no hace realmente hacer nada a menos que haya un inicializador.

+1

+1 * la declaración en sí misma no hace nada *. Ese es el punto clave. Sin un inicializador, no se genera código. Las reglas aseguran que no estás salteando ningún código. –

+0

@Ernest, tengo curiosidad por cómo se define x porque su definición ha desaparecido. –

+2

Imagine que un registro de procesador libre está designado para contener 'x'. Eso es solo contabilidad en el compilador; no hay nada físicamente en el código generado que dice "Register 17 is now' x'. " Ahora, si 'x' se inicializara, tendríamos código para establecer el valor del registro, pero como dijimos, no hay nada de eso. –

Cuestiones relacionadas