Обнаружил для себя такую неожиданную вещь: код
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;
}
Вариант с int var;
работает потому, что такая запись не приводит к какой-либо инициализации. Стоит добавить инициализацию, как также получим ошибку "перепрыгивания". std::string
же сложный класс со своим конструктором, поэтому явная инициализация не требуется и всё равно будет вызван конструктор по умолчанию.
При этом для int
остаётся возможность присвоить переменной значение и работать с ней как ни в чём ни бывало в любой ветке ниже определение переменной.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Заметил, что скомпилированный в jar проект java запускается на одном компе, но не запускается на другомЯ сразу понял, что дело в разных версиях...
Допустим, я создаю строковый одномерный массивВ дальнейшем к каждому его элементу мне нужно будет прибавить другую строку
Имеется такого рода вопрос, необходимо распарсить HTML страничку на GroovyНагуглил сторонние библиотеки, однако проблема заключается в том, что...