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
=
|
(2) | (desde C++20) |
|
struct
view_base
{
}
;
|
(3) | (desde C++20) |
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.
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
.
Contenidos |
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 |