Почему я не могу заархивировать генератор lvalue?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему я не могу заархивировать генератор lvalue?

Сообщение Anonymous »

Следующая простая программа компилируется и работает:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»