Подтвердить что ты не робот

Переключатель "передача управления обходит инициализацию:" ​​при вызове функции

Я получаю "передачу обхода управления инициализацией ошибки:" при попытке построить следующий переключатель:

switch (retrycancel)
{
    case 4:    //The user pressed RETRY
        //Enumerate all visible windows and store handle and caption in "windows"
        std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); 
        break;

    case 2: 
        //code
}

Это как-то связано с моим вызовом моей функции перечисления. Если не разрешено вызывать функцию внутри коммутатора, есть ли способ обхода проблемы такого рода?

4b9b3361

Ответ 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, так как он не был изменен в вашем примере.

Ответ 2

переключатель по существу равен goto, т.е. соответствует goto соответствующей метке. Стандарт С++ запрещает goto обходить инициализацию объекта, отличного от POD. Возьмите объявление вектора в фигурные скобки, и оно решит проблему.

switch (retrycancel)
    {
     case 4:                //The user pressed RETRY
     {
        std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); //Enumerate all visible windows and store handle and caption in "windows"
        break;
     }
    case 2: 
        //code
    }