std::ranges::sized_range, std::ranges::disable_sized_range
De es.cppreference.net
| Definido en el encabezado <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(1) | (desde C++20) (hasta C++26) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(desde C++26) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (desde C++20) |
1) El concepto
sized_range especifica los requisitos de un range(hasta C++26)approximately_sized_range(desde C++26) tipo que conoce su tamaño en tiempo constante mediante la función size.2) El
disable_sized_range existe para permitir el uso de tipos de rango que proporcionan una función size (ya sea como miembro o como no miembro) pero que de hecho no modelan sized_range. Los usuarios pueden especializar disable_sized_range para tipos definidos por programa sin cualificación cv. Dichas especializaciones deberán ser utilizables en expresiones constantes y tener tipo const bool.Requisitos semánticos
1)
Dado un lvalue
t
de tipo
std::
remove_reference_t
<
T
>
,
T
modela
sized_range
solo si
- ranges:: size ( t )
-
- tiene complejidad de tiempo amortizada constante,
- no altera el valor de t de manera observable para expresiones que preservan 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 sized de una sola pasada puede soportar una llamada a size solo antes de la primera llamada a begin, pero un rango forward debe soportar size en todo momento).
Notas
disable_sized_range
no puede utilizarse para excluir un rango cuyos iterador y centinela satisfacen
sized_sentinel_for
;
std::disable_sized_sentinel_for
debe utilizarse en su lugar.
disable_sized_range
no puede especializarse para tipos de array o tipos de referencia.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range y ranges::reserve_hint |
Ejemplo
Ejecutar este código
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
Véase también
|
(C++20)
|
especifica un rango cuyo tipo de iterador satisface
random_access_iterator
(concepto) |
|
(C++20)
|
especifica un rango cuyo tipo de iterador satisface
contiguous_iterator
(concepto) |