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> inlineconstexprbool enable_view = | (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 constbool.[editar]Requerimientos semánticos
T
modela view
solo si: - la construcción por movimiento de
T
tiene complejidad de tiempo constante, y - si N copias o movimientos se hacen desde un objeto
T
que mantiene M elementos, entonces estos N objetos tienen una destrucción 𝓞(N+M) (lo que implica que un objetoview
fuente de una operación de movimiento tiene una destrucción 𝓞(1) ), y - o bien std::copy_constructible<T> es false, o la construcción por copia de
T
tiene complejidad de tiempo constante, y - o bien std::copyable<T> es false, o la asignación por copia de
T
no tiene una complejidad de tiempo mayor que la de la destrucción seguida por construccón por copia.
[editar]Notas
Son ejemplos de tipos view
:
- Un tipo
range
que envuelve un par de iteradores, por ejemplo, std::ranges::subrange<I>. - Un tipo
range
que mantiene sus elementos por std::shared_ptr y comparte la propiedad con todas sus copias. - Un tipo
range
que 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.
[editar]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ó. |