std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
Definido en el encabezado
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
t
)
{
|
(desde C++20) | |
El concepto
range
define los requisitos de un tipo que permite la iteración sobre sus elementos proporcionando un iterador y un centinela que denotan los elementos del rango.
Contenidos |
Requisitos semánticos
Dada una expresión
E
tal que
decltype
(
(
E
)
)
es
T
,
T
modela
range
solo si
-
[ranges:: begin ( E ),ranges:: end ( E ))denota un rango , y - tanto ranges:: begin ( E ) como ranges:: end ( E ) tienen tiempo constante amortizado y no alteran el valor de E de manera observable para expresiones que preservan la igualdad , y
-
si el tipo de
ranges::
begin
(
E
)
modela
forward_iterator, ranges:: begin ( E ) preserva la igualdad (en otras palabras, los forward iterators admiten algoritmos de múltiples pasadas) .
Notas
Una típica
range
class solo necesita proporcionar dos funciones:
-
Una función miembro
begin()cuyo tipo de retorno modelainput_or_output_iterator. -
Una función miembro
end()cuyo tipo de retorno modelasentinel_for<It>, dondeItes el tipo de retorno debegin().
Alternativamente, pueden ser funciones no miembro, que se encuentran mediante argument-dependent lookup .
Ejemplo
#include <ranges> // Un rango mínimo struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // No es un rango: no tiene begin/end struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // No es un rango: begin no retorna un input_or_output_iterator struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3915 | C++20 |
ranges::
begin
(
t
)
y
ranges::
end
(
t
)
no requerían variaciones de expresión implícitas |
se eliminó la
descripción redundante |