std::ranges:: begin
|
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 */
|
(desde C++20) | |
Devuelve un iterador al primer elemento del argumento.
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:
-
t
+
0
si
t
tiene un tipo de arreglo.
-
Si
std::
remove_all_extents_t
<
std::
remove_reference_t
<
T
>>
está incompleto, entonces la llamada a
ranges::beginestá mal formada, sin diagnóstico requerido.
-
Si
std::
remove_all_extents_t
<
std::
remove_reference_t
<
T
>>
está incompleto, entonces la llamada a
- 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 .
-
De lo contrario,
decay-copy
(
begin
(
t
)
)
(hasta C++23)
auto
(
begin
(
t
)
)
(desde C++23)
, si
Tes 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 debeginse 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
|
(C++20)
|
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) |