Ответ 1
раздел 6.6.4 стандарта С++:
Утверждение goto безоговорочно передает управление заявлению помеченный идентификатором. идентификатор должен быть меткой (6.1) расположенный в текущей функции.
раздел 6.7 стандарта С++:
Можно перенести в блок, но не таким образом, чтобы обходить объявления с инициализацией. программа, которая перескакивает с точки где локальная переменная с автоматическим срок хранения не является точка, в которой она находится, плохо сформированный, если переменная не имеет POD типа (3.9) и объявляется без инициализатор
Акцент, добавленный мной. Поскольку switch
действительно goto
скрывается, вы сталкиваетесь с этим поведением. Чтобы решить эту проблему, добавьте фигурные скобки, если вы должны использовать switch
switch (retrycancel)
{
case 4:
{
const std::vector<MainHandles::window_data> windows(
MainHandles().enum_windows().get_results()
);
break;
}
case 2:
//code
}
или рефакторинг в if
/else
if (retrycancel == 4) {
const std::vector<MainHandles::window_data> windows(
MainHandles().enum_windows().get_results()
);
} else if (retrycancel == 2)
// code
} else {
...
}
Хотя для меня не очевидно, что вы надеетесь достичь с созданием windows
vector
внутри switch
, поэтому вам может потребоваться переосмыслить ваш дизайн. Примечание Я добавил квалификатор const
в windows
, так как он не был изменен в вашем примере.