sección 6.6.4 de la norma C++:
La instrucción goto incondicionalmente transfiere el control a la declaración etiquetado por el identificador. El identificador debe ser una etiqueta (6.1) ubicada en la función actual.
sección 6.7 de la norma C++:
Es posible transferir en un bloque , pero no de una manera que no pasa por declaraciones con inicialización. Un programa que salta desde un punto donde una variable local con una duración automática de almacenamiento no está en el ámbito de un punto donde está en su alcance es mal formada a menos que la variable tiene POD tipo (3.9) y se declara sin un inicializador
énfasis añadido por mí. Como switch
es realmente goto
disfrazado, te encuentras con este comportamiento. Para solucionar esto, agregar las llaves si debe utilizar un switch
switch (retrycancel)
{
case 4:
{
const std::vector<MainHandles::window_data> windows(
MainHandles().enum_windows().get_results()
);
break;
}
case 2:
//code
}
o refactorizar en if
/else
if (retrycancel == 4) {
const std::vector<MainHandles::window_data> windows(
MainHandles().enum_windows().get_results()
);
} else if (retrycancel == 2)
// code
} else {
...
}
Aunque no es obvio para mí lo que esperas lograr con la creación de la windows
vector
dentro de un switch
, por lo que es posible que desee reconsiderar su diseño. Nota Agregué un calificador const
a windows
ya que no está modificado en su ejemplo.
Gracias a su respuesta, fue una tarde ayer poco, así que copié la llamada de función incorrecta en el interruptor, el "real" tiene más sentido ;-). Sin embargo, iré con el loop else sugerido. ¿Cuál es la fuente oficial del estándar de C++ que citó? – Lumpi
@Lumpi el estándar ISO C++, compré una copia hace algún tiempo. –
@SamMiller: ¿Puede explicar en términos más simples por qué se requieren llaves en ciertos casos de interruptores? Estaba creando un nuevo objeto en una de las cajas del conmutador y obtuve un error de compilación, pero si declaro o inicializo una variable normal, digo int. No obtengo ningún error – tanz