Следующая простая программа компилируется и работает:
Код: Выделить всё
std::generator get_ints(int n)
{
for (int i{0}; i < n; ++i)
co_yield i;
}
int main(int argc, char* argv[])
{
std::vector floats { 0.0f, 1.0f, 2.0f, 3.0f };
for (auto [i, f] : std::views::zip(get_ints(4), floats))
std::println("{}: {}", i, f);
}
Однако, если я вместо этого сохраню генератор в переменной и попытаюсь сделать то же самое, он не скомпилируется:
Код: Выделить всё
std::generator get_ints(int n)
{
for (int i{0}; i < n; ++i)
co_yield i;
}
int main(int argc, char* argv[])
{
std::vector floats { 0.0f, 1.0f, 2.0f, 3.0f };
auto ints = get_ints(4);
for (auto [i, f] : std::views::zip(ints, floats))
std::println("{}: {}", i, f);
}
Насколько я понимаю, это не удается, потому что std::ranges::viewable_range дает значение false, а std: :ranges::viewable_range имеет значение true. Но почему первый случай запрещен? Я знаю, что генератор не является диапазоном, но он ведет себя так же, как любой другой тип диапазона, который я тестировал (хотя я тестировал только несколько), удовлетворяет этому ограничению, когда передается как ссылка на lvalue. Так почему же в этом случае генератор становится особенным?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... -generator