Когда я говорю о «копировании сопрограммы», я имею в виду, по сути, выполнение операции копирования «будущего» объекта, возвращаемого функцией сопрограммы, в результате чего пользователь может считать «копию» этого будущего. .
Мелкое копирование сопрограммы (скопированное будущее ссылается на тот же coroutine_handle
и объект обещания) может иметь некоторую небольшую полезность в некоторых случаях. Для сценариев без генераторов вы фактически создаете эквивалент std::shared_future
: есть несколько мест, из которых можно извлечь обещанные значения.
Я не совсем уверен, насколько это полезнодля сценариев генератора. Гораздо сложнее рассуждать о том, что делает генератор и где он находится в процессе своего исполнения. Это также в основном убило бы любую надежду на исключение выделения, поскольку у вас было бы несколько ссылок на обещание / дескриптор.
Глубокое копирование сопрограммы практически невозможно. Для глубокого копирования сопрограммы вам необходимо скопировать стек такой сопрограммы. Даже если мы предположим, что сопрограмма гарантированно не будет выполняться во время операции копирования, это не совсем выполнимо. Почему?
Поскольку в стеке могут содержаться объекты, которые нельзя скопировать. И сопрограммы не обязательно должны быть встроенными, поэтому компилятор, который должен скомпилировать операцию копирования, не обязательно имеет доступ к исходному коду самой сопрограммы. Таким образом, он не может определить, является ли стек сопрограмм копируемым.
Теперь, по крайней мере, гипотетически возможно иметь какой-то тест во время выполнения, чтобы увидеть, является ли копирование возможной операцией для этой сопрограммы. Но это его собственная банка червей.
Но любой вид глубокого копирования потребует изменений в механизме сопрограмм;поверхностное копирование - это то, что вы можете гипотетически реализовать в своем собственном будущем типе.
Причина, по которой ваш код имеет семантику глубокого копирования, заключается в том, что он на самом деле не использует механизм обещания / будущего сопрограммы. Ни обещание, ни выполнение сопрограммы не имеют значения;Ваш объект сопрограммы. Таким образом, копирование вашего объекта сопрограммы создает копию этого значения. Фактические сопрограммы C ++ 20 не работают таким образом.