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

186
15 сентября 2018, 04:40

Обнаружил для себя такую неожиданную вещь: код

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, то все в порядке?

Answer 1

Смотрите - а что ему делать, если вы получите a==2 и при этом решите в ветви обратиться к этой переменной alfa? Инициализировать ее? нет?

Во избежание таких фокусов - перепрыгивания через инициализацию - это считается ошибкой.

Просто возьмите переменную в фигурные скобки, чтоб ограничить область видимости:

switch (a) {
    case 1:
        {
            std::string alfa;
        }
        break;
    case 2:
        break;
    default:
        break;
}
Answer 2

Вариант с int var; работает потому, что такая запись не приводит к какой-либо инициализации. Стоит добавить инициализацию, как также получим ошибку "перепрыгивания". std::string же сложный класс со своим конструктором, поэтому явная инициализация не требуется и всё равно будет вызван конструктор по умолчанию.

При этом для int остаётся возможность присвоить переменной значение и работать с ней как ни в чём ни бывало в любой ветке ниже определение переменной.

READ ALSO
Java приложения - запуск на разных версиях

Java приложения - запуск на разных версиях

Заметил, что скомпилированный в jar проект java запускается на одном компе, но не запускается на другомЯ сразу понял, что дело в разных версиях...

174
Автозаполнение массива

Автозаполнение массива

Допустим, я создаю строковый одномерный массивВ дальнейшем к каждому его элементу мне нужно будет прибавить другую строку

261
Парсинг HTML страницы на Groovy

Парсинг HTML страницы на Groovy

Имеется такого рода вопрос, необходимо распарсить HTML страничку на GroovyНагуглил сторонние библиотеки, однако проблема заключается в том, что...

193