Мой вопрос касается отрывка в cppreference, который меня сбивает с толку:
Если сопрограмма завершается неперехваченным исключением, она выполняет следующее:
- перехватывает исключение и вызывает Promise.unhandled_Exceptionion() из блока catch
- вызывает обещание.final_suspend() и co_awaits результата (например, чтобы возобновить продолжение или опубликовать результат). Возобновление сопрограммы с этого момента является неопределенным поведением.
(см. https://en.cppreference.com/w/cpp/language/coroutines)
Меня смущает второй пункт. Они говорят, что Final_suspend предназначен для выполнения продолжений, но затем они говорят, что возобновление сопрограммы «с этой точки» является неопределенным поведением. Это кажется почти противоречивым. Что именно здесь означает неопределенное поведение? Я могу представить 3 сценария:
resume
на coroutine_handle в теле final_suspend
?await_suspend
последнего ожидания?await_suspend
последнего ожидания?Если одно или все из этих действий являются неопределенными, верно ли это также для final_suspend
после return_void
или return_value
или только после unhandled_exception
?
(Я создал пример кода для сценария 3 на godbolt. Для этого вопроса это не обязательно, но может быть полезно. Вызывает ли моя обработка исключений и продолжений неопределенное поведение в этом примере?)
@Enlico Спасибо, я понял свою ошибку. В конце концов, это было простое неправильное прочтение/неверное толкование.
coroutine_handle::resume
дает неопределенное поведение для любой сопрограммы, которая приостановлена в последней точке приостановки. Это всегда верно для любой сопрограммы, приостановленной таким образом.
Cppreference просто указывает на то, что, если исключение не перехвачено, сопрограмма считается приостановленной в последней точке приостановки.
Теперь, когда вы указали на это, я понимаю, что просто неверно истолковал это предложение. Я думал, это означает «возобновление любой сопрограммы из final_suspend
— это UB». Но это означает, как вы говорите, «возобновление этой final_suspend
ed сопрограммы с этого момента является UB». Спасибо, иногда за деревьями трудно увидеть лес.
Я не думаю, что возобновление продолжения означает возобновление той сопрограммы, которая только что достигла
final_suspend
, но, возможно, другую.