Пусть coroutine_foo будет сопрограммой: как бы вы реализовали ее сигнатуру? >
Поскольку копирование контейнера обходится дорого, а сопрограммы должны принимать только ссылки на объекты, которые гарантированно будут активны на протяжении всего времени жизни сопрограммы, я думаю, что это инклюзивная foo_coroutine:
- Принимать диапазоны, являющиеся значениями lvalue. В этом случае следует создать const ссылку на lvalue, которая безопасна, поскольку контейнер жив на протяжении всей сопрограммы. Я думаю о
Код: Выделить всё
foo_coroutine(const std::ranges::range auto&) - Принимать представления диапазона по значению. Я думаю, что foo_coroutine(std::ranges::borrowed_range auto) принимает по значению
для этого, поскольку заимствованный_диапазон семантически гарантирует дешевое копирование, и его безопаснее копировать.
Не следует принимать контейнеры по значению (поскольку их копирование дорого
) — поэтому следует блокировать диапазоны значений rvalue. Я имею в виду: coroutine_foo(const std::ranges::range auto&&) = delete
Код: Выделить всё
auto coroutine_foo(const std::ranges::range auto& rng) {
return coroutine_foo_impl(rng);
}
auto coroutine_foo(std::ranges::borrowed_range auto rng) {
return coroutine_foo_impl(std::move(rng)); // though move is probably pointless here
}
auto coroutine_foo(const std::ranges::range auto&&) = delete;
Примечание: Я думаю, что это будет подходящий API для сопрограммы, которой задан диапазон, который не следует изменять, но я что-то упускаю?
Подробнее здесь: https://stackoverflow.com/questions/792 ... onst-range
Мобильная версия