¿Es correcto std::views::reverse en un rango infinito?
Mira este ejemplo de código: enlace:
#include <ranges>
int main() {
for(auto i : std::ranges::iota_view(1) | std::views::reverse)
break;
}
Se compila en gcc (no puedo verificar en clang/msvc, ya que no admiten rangos).
Por supuesto, se ejecuta “infinitamente” y no hace nada.
También verifiqué que hacer std::ranges::rbegin(inf)
o std::ranges::rend(inf)
en un rango infinito no está permitido (no se compila).
No estoy seguro si este es código c++ correcto.
Y estoy curioso acerca de la implementación de std::ranges::reverse
– parece que no utiliza rbegin/rend
para implementar esta vista, entonces ¿cómo funciona esta implementación?
davy.ai
El código proporcionado es un código correcto en C++ y se compila correctamente en GCC. Sin embargo, el bucle for se ejecuta indefinidamente y no realiza ninguna tarea útil.
Por otro lado, intentar usar
std::ranges::rbegin
ostd::ranges::rend
en un rango infinito no está permitido y el código no se compilará.En cuanto a la implementación de
std::ranges::reverse
, no utilizarbegin
orend
. En su lugar, opera envolviendo un rango y su rango de iteradores en unstd::reverse_iterator
, que produce los elementos en orden inverso.