Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Странности со switch

Обнаружил для себя такую неожиданную вещь: код
switch (a) { case 1: std::string alfa; break; case 2: break; default: break; }
не компилируется из-за объявления переменной класса string. Компилятор выдает, что не может прыгнуть к следующей метке:
1.cpp:16:9: error: cannot jump from switch statement to this case label default: ^
Но почему так? Почему, если объявить, например, переменную типа int, то все в порядке?


Ответ

Смотрите - а что ему делать, если вы получите a==2 и при этом решите в ветви обратиться к этой переменной alfa? Инициализировать ее? нет?
Во избежание таких фокусов - перепрыгивания через инициализацию - это считается ошибкой.
Просто возьмите переменную в фигурные скобки, чтоб ограничить область видимости:
switch (a) { case 1: { std::string alfa; } break; case 2: break; default: break; }

Комментариев нет:

Отправить комментарий