Неспособность вызвать обратное на последовательности Фибоначчи в диапазоне -3

Я не могу сделать view::reverse оперировать первыми 10 элементами (используя view::take(10)) последовательности Фибоначчи v генерируется с использованием range-v3"s view::generate

#include <iostream>
#include <range/v3/view/iota.hpp>
#include <range/v3/view/generate.hpp>
#include <range/v3/view/take.hpp>
#include <range/v3/view/reverse.hpp>

using namespace ranges;

int main() {
    int i = 0 ; int j = 1;
    auto v = view::generate([&]()->int{int tmp = i; i += j; std::swap(i, j); return tmp;}); // fibonacci
    std::cout << (v | view::take(10) | view::reverse) << '\n';
    return 0;
}

Я получаю следующую ошибку (сопровождаемую намного большим количеством выходных данных, связанных с шаблоном):

error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'void')
     std::cout << (v | view::take(10) | view::reverse) << '\n';

Однако, если я использую view::iota создавать vнапример,

 auto v = view::iota(20);

Я не получаю ошибку и ожидаемый результат.

Что не так?

1 ответ

Решение

view::generate произвел входной диапазон. Вы не можете изменить входной диапазон. Это требует двунаправленного. view::iota с другой стороны, выдает диапазоны RandomAccess, которые можно изменить на противоположные.

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