std::ranges::sized_range, std::ranges::disable_sized_range
De cppreference.com
Definido en el archivo de encabezado <ranges>
|
||
template< class T > concept sized_range = ranges::range<T> && |
(1) | (desde C++20) |
template<class> inline constexpr bool disable_sized_range = false; |
(2) | (desde C++20) |
1) El concepto
sized_range
especifica los requerimientos de un tipo range
que conoce su tamaño en tiempo constante con la función size
.2)
disable_sized_range
existe para admitir el uso de tipos rango que proporcionan una función size
(ya sea como miembro o como no miembro) pero de hecho no modelan size_range
. Los usuarios pueden especializar a disable_sized_range
para tipos definidos por programa, no calificados-cv. Dichas especializaciones se podrán utilizar en las expresiones constantes y tendrán el tipo const bool.[editar] Requerimientos semánticos
1) Dado un l-valor
t
de tipo std::remove_reference_t<T>, T
modela sized_range
solo si
- ranges::size(t),
- tiene una complejidad de tiempo constante amortizada,
- no altera el valor de
t
de una manera observable en expresiones que conservan la igualdad, y - es igual a ranges::distance(ranges::begin(t), ranges::end(t)), y
- si ranges::iterator_t<T> modela
forward_iterator
, ranges::size(t) está bien definido independientemente de la evaluación de ranges::begin(t) (en otras palabras, un rango de un solo paso, con tamaño, puede admitir una llamada asize
solo antes de que comience la primera llamada, pero un rango de avance debe admitirsize
en todo momento).
[editar] Notas
disable_sized_range
no se puede usar para excluir un rango cuyo iterador y centinela satisfacen sized_sentinel_for
; disable_sized_sentinel_for
debe usarse en su lugar.
disable_sized_range
no se puede especializar para tipos array o tipos referencia.