Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < class T >

concept range = requires ( T & t ) {
ranges:: begin ( t ) ; // equality-preserving for forward iterators
ranges:: end ( 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

Notas

Una típica range class solo necesita proporcionar dos funciones:

  1. Una función miembro begin() cuyo tipo de retorno modela input_or_output_iterator .
  2. Una función miembro end() cuyo tipo de retorno modela sentinel_for <It> , donde It es el tipo de retorno de begin() .

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