goto
или switch
может перепрыгнуть через заявление-заявление, учитывая, что он не имеет инициализатора, а конструкция тривиальна и что объект также является тривиально разрушаемым.При переходе по декларации, зачем нужен тривиальный деструктор?
В чем смысл ограничения на деструктор?
struct trivial {
trivial() = default;
~ trivial() = default;
};
struct semi_trivial {
semi_trivial() = default;
~ semi_trivial() noexcept { do_something(); }
};
void foo() {
goto good_label; // OK
trivial foo;
good_label:
goto bad_label; // Error: this goto statement
semi_trivial bar; // cannot jump over this declaration.
bad_label:
std::cout << "hi\n";
}
@Barry Первый 'break;' никогда не выполняется, так как 'i' имеет значение' 2'. Вопрос заключается в том, должен ли * second * 'break;' разрушать 'st', хотя он не был инициализирован и не использовался в операциях' case 2'. Без специальной формулировки, чтобы предотвратить ее, она будет разрушена, но ее разрушение может быть неправильным. Отсюда запрет прыгать на «случай 2». – hvd
А, да. Должно добавить все это к ответу. – Barry
Спасибо! При чтении между строками бумага, похоже, говорит о том, что деструктор должен работать, если был запущен тривиальный конструктор. Для меня, если объект можно использовать в пределах области действия, тогда он эффективно построен, и деструктор должен быть запущен. Хммм ... – Potatoswatter