std::ranges::view, std::ranges::enable_view, std::ranges::view_base
| 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) |
view especifica los requisitos de un tipo range que tiene propiedades semánticas adecuadas para su uso en la construcción de tuberías de adaptadores de rangos.enable_view se utiliza para indicar si un range es un 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. Tales especializaciones deben ser utilizables en expresiones constantes y tener tipo const bool.
Requisitos semánticos
T
modela
view
solo si:
-
la construcción por movimiento de
Ttiene complejidad temporal constante, y -
si se realizan
N
copias y/o movimientos desde un objeto
Tque contiene M elementos, entonces estos N objetos tienen 𝓞(N+M) destrucción (lo que implica que un objetoviewmovido tiene 𝓞(1) destrucción), y -
ya sea que
std::
copy_constructible
<
T
>
sea
false
, o la construcción por copia de
Ttenga complejidad temporal constante, y -
ya sea que
std::
copyable
<
T
>
sea
false
, o la asignación por copia de
Tno 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 tipo de
rangeque envuelve un par de iteradores, por ejemplo, std :: ranges:: subrange < I > . -
Un tipo de
rangeque mantiene sus elementos mediante std::shared_ptr y comparte la propiedad con todas sus copias. -
Un tipo de
rangeque genera sus elementos bajo demanda, por ejemplo, std::ranges::iota_view .
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 |