раздел 6.6.4 стандарта C ++:
Заявление goto безоговорочно
передает управление на утверждение
помечены идентификатором.
идентификатор должен быть меткой (6.1)
находится в текущей функции.
раздел 6.7 стандарта C ++:
Возможна передача в
блок, но не так, чтобы обойти
объявления с инициализацией .
программа, которая прыгает с точки
где локальная переменная с автоматическим
срок хранения не входит в сферу
Точка, где это находится в области видимости
плохо сформирован, если переменная не имеет 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
, поскольку он не изменен в вашем примере.