No C++ 20, quando uso std::ranges::views::take()
em a std::ranges::istream_view()
, o próximo token após a istream_view
iteração da visualização take é ignorado.
Considere o seguinte trecho de código C++20:
#include <iostream>
#include <ranges>
#include <sstream>
#include <vector>
#include <algorithm>
namespace rn = std::ranges;
int main() {
std::string input = "1 2 3 4 5 6 7 8 9 10";
std::istringstream input_stream(input);
std::vector<int> head;
rn::copy(rn::istream_view<int>(input_stream) | rn::views::take(5),
std::back_inserter(head));
int next_int = 0;
input_stream >> next_int;
for(auto x : head) std::cout << x << " ";
std::cout << next_int << std::endl;
}
Quando compilo e executo este código em g++14 ou clang++17, a seguinte saída é produzida (observe o "6" ausente):
1 2 3 4 5 7
Link Godbolt: https://godbolt.org/z/vdGvx9666
Por que isso acontece? Este é o comportamento pretendido? O que pode ser feito para contornar isso?