std::ranges::sized_range, std::ranges::disable_sized_range
De cppreference.com
<tbody>
</tbody>
| Definido en el archivo de encabezado <ranges>
|
||
template< class T > concept sized_range = ranges::range<T> && requires(T& t) { ranges::size(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.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
tde 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>modelaforward_iterator,ranges::size(t)está bien definido independientemente de la evaluación deranges::begin(t)(en otras palabras, un rango de un solo paso, con tamaño, puede admitir una llamada asizesolo antes de que comience la primera llamada, pero un rango de avance debe admitirsizeen todo momento).
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.