переключатель "передача управления обходит инициализацию:" при вызове функции - PullRequest
48 голосов
/ 28 февраля 2011

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

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
}

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

Ответы [ 2 ]

73 голосов
/ 28 февраля 2011

раздел 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, поскольку он не изменен в вашем примере.

11 голосов
/ 28 февраля 2011

переключатель - это, по сути, goto, то есть это goto для соответствующей метки. Стандарт C ++ запрещает 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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...