std::ranges::view, std::ranges::enable_view, std::ranges::view_base
| Definido en el archivo de encabezado <ranges>
|
||
template<class T> concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>; |
(1) | (desde C++20) |
template<class T> inline constexpr bool enable_view = std::derived_from<T, view_base> || /*se-deriva-de-la-interfaz-de-vista*/<T>; |
(2) | (desde C++20) |
struct view_base { }; |
(3) | (desde C++20) |
view (vista) especifica los requerimientos de un tipo range (rango) que tiene las propiedades semánticas adecuadas para su uso en la construcción de segmentaciones (pipelines) adaptadoras de rangos.enable_view se usa para indicar si un rango (range) es una vista (view). /*se-deriva-de-la-interfaz-de-vista*/<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, no calificados-cv, que modelen view, y false para tipos que no. Tales especializaciones deben ser usables en expresiones constantes y tener tipo const bool.
Requerimientos semánticos
T modela view solo si:
- la construcción por movimiento de
Ttiene complejidad de tiempo constante, y - si N copias o movimientos se hacen desde un objeto
Tque mantiene M elementos, entonces estos N objetos tienen una destrucción 𝓞(N+M) (lo que implica que un objetoviewfuente de una operación de movimiento tiene una destrucción 𝓞(1) ), y - o bien
std::copy_constructible<T>esfalse, o la construcción por copia deTtiene complejidad de tiempo constante, y - o bien
std::copyable<T>esfalse, o la asignación por copia deTno tiene una complejidad de tiempo mayor que la de la destrucción seguida por construccón por copia.
Notas
Son ejemplos de tipos view:
- Un tipo
rangeque envuelve un par de iteradores, por ejemplo,std::ranges::subrange<I>. - Un tipo
rangeque mantiene sus elementos por std::shared_ptr y comparte la propiedad con todas sus copias. - Un tipo
rangeque genera sus elementos bajo pedido, por ejemplo, std::ranges::iota_view.
Un contenedor copiable como std::vector<std::string> generalmente no cumple con los requerimientos semánticos de view, ya que copiar el contenedor copia todos sus elementos, lo que no puede hacerse en tiempo constante.
Mientras que las vistas se describieron originalmente como descrito como rangos de baratos de copiar y de no propiedad, no se requiere que un tipo sea copiable o de no propiedad para modelar view. Sin embargo, todavía debe ser barato de copiar (si es copiable), mover, asignar y destruir, para que los adaptadores de rangos no tengan una complejidad inesperada.
Por defecto, un tipo que modela movable y range se considera una vista si se deriva pública e inequivocadamente de view_base, o exactamente una especialización de std::ranges::view_interface.
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P2325R3 | C++20 | view requería default_initializable
|
No se requiere. |
| LWG 3549 | C++20 | enable_view no detectaba herencia de view_interface
|
La detecta. |
| P2415R2 | C++20 | La restricción de la complejidad de tiempo de la destrucción era demasiado estricta. | Se relajó. |