Namespaces
Variants

std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < class T >
concept view = ranges:: range < T > && std:: movable < T > && ranges :: enable_view < T > ;
(1) (desde C++20)
template < class T >

constexpr bool enable_view =

std:: derived_from < T, view_base > || /*is-derived-from-view-interface*/ < T > ;
(2) (desde C++20)
struct view_base { } ;
(3) (desde C++20)
1) El concepto view especifica los requisitos de un tipo range que posee propiedades semánticas adecuadas para su uso en la construcción de tuberías de adaptadores de rangos.
2) La plantilla de variable enable_view se utiliza para indicar si un range es una view . /*is-derived-from-view-interface*/ < T > es true si y solo si T tiene exactamente una clase base pública ranges:: view_interface < U > para algún tipo U , y T no tiene clases base de tipo ranges:: view_interface < V > para ningún otro tipo V .
Los usuarios pueden especializar enable_view a true para tipos definidos por el programa sin calificación cv que modelen view , y false para tipos que no lo hagan. Dichas especializaciones deben ser utilizables en expresiones constantes y tener tipo const bool .
3) Derivar de view_base permite que los tipos range modelen view .

Contenidos

Requisitos semánticos

1) T modela view solo si:
  • la construcción por movimiento de T tiene complejidad temporal constante, y
  • si se realizan N copias y/o movimientos desde un objeto T que contiene M elementos, entonces estos N objetos tienen 𝓞(N+M) destrucción (lo que implica que un objeto view movido tiene 𝓞(1) destrucción), y
  • ya sea que std:: copy_constructible < T > sea false , o la construcción por copia de T tenga complejidad temporal constante, y
  • ya sea que std:: copyable < T > sea false , o la asignación por copia de T no tenga mayor complejidad temporal que la destrucción seguida de construcción por copia.

Especializaciones

Especializaciones de enable_view para todas las especializaciones de las siguientes plantillas estándar se definen como true :

(desde C++26)

Notas

Ejemplos de tipos de view son:

Un contenedor copiable como std:: vector < std:: string > generalmente no cumple con los requisitos semánticos de view ya que copiar el contenedor copia todos los elementos, lo cual no puede realizarse en tiempo constante.

Aunque originalmente se describía que las vistas eran rangos no propietarios y copiables de forma económica, un tipo no necesita ser copiable o no propietario para modelar view . Sin embargo, aún debe ser económico copiar (si es copiable), mover, asignar y destruir, para que range adaptors no tengan complejidad inesperada.

Por defecto, un tipo que modela movable y range se considera una vista si está derivado pública e inequívocamente de view_base , o exactamente de una especialización de std::ranges::view_interface .

Ejemplo

Una vista mínima.

#include <ranges>
struct ArchetypalView : std::ranges::view_interface<ArchetypalView>
{
    int* begin();
    int* end();
};
static_assert(std::ranges::view<ArchetypalView>);

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2325R3 C++20 view requería default_initializable no requiere
LWG 3549 C++20 enable_view no detectaba herencia de view_interface detecta
P2415R2 C++20 la restricción sobre la complejidad temporal de destrucción era demasiado estricta relajada