в корутинах, но наткнулся на очень странное поведение кода. То ли я что-то делаю не так, то ли gcc глючит.
Вот сам код https://godbolt.org/z/aGr79MKGq
Есть две корутины: fib и takeN. Я передаю fib как rvalue в takeN, и она должна жить во фрейме takeN.
Потом в fib кидаю исключение прямо на первой строчке, которое перебрасываю в unhandle_exception промиса.
В результате деструктор её return-object вызывается два раза: один раз в fib, а второй раз в takeN.
Вопрос, почему это происходит и как правильно пропагировать исключения, если нельзя их перекидывать из unhandle_exception?
Сохранить исключение в promise, перебросить когда из промиса будут пытаться получить результат его работы.
Да, так работает корректно. Спасибо
Но думаю, что лучше всего кидаться после resume() корутины
Какой смысл делать resume на корутине после того как она вышла по исключению? Скорее всего это ub. Но я не уверен, что правильно понял мысль.
Неа, после resume, в котором было выкинуто исключение и перехвачено в unhandled_exception
Речь идет о генераторе? Там, наверное, может иметь смысл делать resume и кидать исключение на инкременте итератора, а значение возвращать при разыменовании. Но не уверен что я бы предпочел такое поведение.
Обсуждают сегодня