Namespaces
Variants

std::ranges:: begin

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
Definido en el encabezado <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ begin = /* unspecified */ ;

}
(desde C++20)
(objeto de punto de personalización)
Firma de llamada
template < class T >

requires /* see below */

constexpr std:: input_or_output_iterator auto begin ( T && t ) ;
(desde C++20)

Devuelve un iterador al primer elemento del argumento.

range-begin-end.svg

Si el argumento es un lvalue o ranges:: enable_borrowed_range < std:: remove_cv_t < T >> es true , entonces una llamada a ranges::begin es equivalente-expresión a:

  1. t + 0 si t tiene un tipo de arreglo.
  2. De lo contrario, decay-copy ( t. begin ( ) ) (hasta C++23) auto ( t. begin ( ) ) (desde C++23) , si esa expresión es válida y su tipo modela std::input_or_output_iterator .
  3. De lo contrario, decay-copy ( begin ( t ) ) (hasta C++23) auto ( begin ( t ) ) (desde C++23) , si T es un tipo de clase o enumeración, esa expresión es válida y su tipo modela std::input_or_output_iterator , donde el significado de begin se establece como si se realizara búsqueda dependiente de argumentos únicamente.

En todos los demás casos, una llamada a ranges::begin está mal formada, lo que puede resultar en fallo de sustitución cuando la llamada aparece en el contexto inmediato de una instanciación de plantilla.

Contenidos

Objetos de punto de personalización

El nombre ranges::begin denota un objeto punto de personalización , que es un objeto función constante de un tipo de clase literal semiregular . Consulte CustomizationPointObject para más detalles.

Notas

Si el argumento es un rvalue (es decir, T es un tipo objeto) y ranges:: enable_borrowed_range < std:: remove_cv_t < T >> es false , la llamada a ranges::begin está mal formada, lo que también resulta en fallo de sustitución.

El tipo de retorno modela std::input_or_output_iterator en todos los casos.

El estándar C++20 requiere que si la función subyacente begin devuelve un prvalue, el valor de retorno se construye por movimiento desde el objeto temporal materializado. Todas las implementaciones devuelven directamente el prvalue en su lugar. El requisito se corrige mediante la propuesta posterior a C++20 P0849R8 para coincidir con las implementaciones.

Ejemplo

#include <cassert>
#include <ranges>
#include <vector>
int main() 
{
    std::vector v{3, 1, 4};
    auto vi = std::ranges::begin(v);
    auto vci = std::ranges::cbegin(v);
    assert(*vi == 3 and *vi == *vci);
    ++vi;
    ++vci; // OK: vci es un objeto modificable
    *vi = 42; // OK: vi apunta a un elemento mutable
    // *vci = 13; // Error: vci apunta a un elemento inmutable
    int a[]{-5, 10, 15};
    auto ai = std::ranges::begin(a); // funciona también con arreglos C
    assert(*ai == -5);
    *ai = 42; // OK
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2602R2 C++20 existe maquinaria para prohibir ciertos begin no miembro encontrados mediante ADL se eliminó dicha maquinaria

Véase también

devuelve un iterador al inicio de un rango de solo lectura
(objeto de punto de personalización)
(C++11) (C++14)
devuelve un iterador al inicio de un contenedor o array
(plantilla de función)