Сопрограмма Final_suspend: это неопределенное поведение?

Мой вопрос касается отрывка в cppreference, который меня сбивает с толку:

Если сопрограмма завершается неперехваченным исключением, она выполняет следующее:

  • перехватывает исключение и вызывает Promise.unhandled_Exceptionion() из блока catch
  • вызывает обещание.final_suspend() и co_awaits результата (например, чтобы возобновить продолжение или опубликовать результат). Возобновление сопрограммы с этого момента является неопределенным поведением.

(см. https://en.cppreference.com/w/cpp/language/coroutines)

Меня смущает второй пункт. Они говорят, что Final_suspend предназначен для выполнения продолжений, но затем они говорят, что возобновление сопрограммы «с этой точки» является неопределенным поведением. Это кажется почти противоречивым. Что именно здесь означает неопределенное поведение? Я могу представить 3 сценария:

  1. Является ли неопределённым поведением прямой или косвенный вызов resume на coroutine_handle в теле final_suspend?
  2. Является ли неопределенным поведением прямое или косвенное возобновление coroutine_handle из тела await_suspend последнего ожидания?
  3. Является ли неопределенным поведение возврат coroutine_handle из await_suspend последнего ожидания?

Если одно или все из этих действий являются неопределенными, верно ли это также для final_suspend после return_void или return_value или только после unhandled_exception?

(Я создал пример кода для сценария 3 на godbolt. Для этого вопроса это не обязательно, но может быть полезно. Вызывает ли моя обработка исключений и продолжений неопределенное поведение в этом примере?)

Я не думаю, что возобновление продолжения означает возобновление той сопрограммы, которая только что достигла final_suspend, но, возможно, другую.

Enlico 07.07.2024 21:57

@Enlico Спасибо, я понял свою ошибку. В конце концов, это было простое неправильное прочтение/неверное толкование.

Wutz 08.07.2024 02:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

coroutine_handle::resume дает неопределенное поведение для любой сопрограммы, которая приостановлена ​​в последней точке приостановки. Это всегда верно для любой сопрограммы, приостановленной таким образом.

Cppreference просто указывает на то, что, если исключение не перехвачено, сопрограмма считается приостановленной в последней точке приостановки.

Теперь, когда вы указали на это, я понимаю, что просто неверно истолковал это предложение. Я думал, это означает «возобновление любой сопрограммы из final_suspend — это UB». Но это означает, как вы говорите, «возобновление этой final_suspended сопрограммы с этого момента является UB». Спасибо, иногда за деревьями трудно увидеть лес.

Wutz 08.07.2024 02:12

Другие вопросы по теме

Функция constexpr шаблона базового класса в производном классе и получила ошибку
Достаточно ли времени жизни локальной лямбды в качестве обработчика завершения для co_spawn, т.е. функции с functor&&?
Использование std::unique_ptr с выровненным типом приводит к предупреждению компилятора
Ошибка возврата массива из функции consteval
Каков ожидаемый результат при объявлении локальной автоматической функции?
Как суммировать std::range?
Как распечатать неструктурные результаты функций constexpr во время компиляции с помощью clang++?
Почему take(n), используемый в istream_view, приводит к пропуску следующего токена в C++20?
Почему объявление функции глобальной области со встроенным типом arg должно быть видимым перед неквалифицированным вызовом этого имени с аргументом типа шаблона?
Есть ли способ отсортировать одну переменную-член в коллекции структур с помощью стандартной библиотеки C++?