В то время как неопределенная природа обсуждалась, я чувствую, что было бы интересно посмотреть на реальный результат и предположить, почему мы его видим.
Хотя у меня нет доказательств, я считаю, что это интересное следствиеоптимизаций компилятора и рассуждения кода.Мы видим, что результат равен 1 2 3 5 6 7
, хотя в коде есть оператор throw
для элемента 5
.Как это могло бы произойти?
На мой взгляд, поскольку у нас f->print()
вне блока try
, компилятор считает, что f
никогда не инициализируется - поэтому конструктор никогда не генерирует.Поскольку конструктор никогда не выбрасывает, val == 5
никогда не верна!Из-за этого ветка удаляется.И, таким образом, у нас есть результат, который у нас есть.