std::ranges:: rend
|
Definido en el encabezado
<ranges>
|
||
|
Definido en el encabezado
<iterator>
|
||
|
inline
namespace
/* no especificado */
{
inline
constexpr
/* no especificado */
rend
=
/* no especificado */
;
|
(desde C++20)
(objeto de punto de personalización) |
|
|
Firma de llamada
|
||
|
template
<
class
T
>
requires
/* ver más abajo */
|
(desde C++20) | |
Devuelve un centinela que indica el final de un rango invertido.
Si
T
es un tipo de array y
std::
remove_all_extents_t
<
std::
remove_reference_t
<
T
>>
está incompleto, entonces la llamada a
ranges::rend
está mal formada, no se requiere diagnóstico.
Si el argumento es un lvalue o
ranges::
enable_borrowed_range
<
std::
remove_cv_t
<
T
>>
es
true
, entonces una llamada a
ranges::rend
es
equivalente-expresión
a:
- decay-copy ( t. rend ( ) ) (hasta C++23) auto ( t. rend ( ) ) (desde C++23) , si esa expresión es válida y su tipo modela std:: sentinel_for < decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > .
-
En caso contrario,
decay-copy
(
rend
(
t
)
)
(hasta C++23)
auto
(
rend
(
t
)
)
(desde C++23)
, si
Tes un tipo clase o enumeración, esa expresión es válida y su tipo modela std:: sentinel_for < decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > , donde el significado derendse establece como si se realizara únicamente búsqueda dependiente de argumentos . - En caso contrario, std:: make_reverse_iterator ( ranges:: begin ( t ) ) si tanto ranges:: begin ( t ) como ranges:: end ( t ) son expresiones válidas, tienen el mismo tipo, y ese tipo modela std::bidirectional_iterator .
En todos los demás casos, una llamada a
ranges::rend
está mal formada, lo que puede resultar en
fallo de sustitución
cuando
ranges
::
rend
(
t
)
aparece en el contexto inmediato de una instanciación de plantilla.
Contenidos |
Objetos de punto de personalización
El nombre
ranges::rend
denota un
objeto de 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
, o si es de un tipo array de límite desconocido, la llamada a
ranges::rend
está mal formada, lo que también resulta en fallo de sustitución.
Si
ranges
::
rend
(
std::
forward
<
T
>
(
t
)
)
es válido, entonces
decltype
(
ranges
::
rend
(
std::
forward
<
T
>
(
t
)
)
)
y
decltype
(
ranges::
begin
(
std::
forward
<
T
>
(
t
)
)
)
modelan
std::sentinel_for
en todos los casos, mientras que
T
modela
std::ranges::range
.
El estándar C++20 requiere que si la llamada de función subyacente
rend
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 <algorithm> #include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> v = {3, 1, 4}; namespace ranges = std::ranges; if (ranges::find(ranges::rbegin(v), ranges::rend(v), 5) != ranges::rend(v)) std::cout << "found a 5 in vector v!\n"; int a[] = {5, 10, 15}; if (ranges::find(ranges::rbegin(a), ranges::rend(a), 5) != ranges::rend(a)) std::cout << "found a 5 in array a!\n"; }
Salida:
found a 5 in array a!
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
rend
no miembro encontrados mediante
ADL
|
se eliminó dicha maquinaria |
Véase también
|
(C++20)
|
devuelve un iterador inverso final para un rango de solo lectura
(objeto de punto de personalización) |
|
(C++20)
|
devuelve un iterador inverso a un rango
(objeto de punto de personalización) |
|
(C++14)
|
devuelve un iterador inverso final para un contenedor o array
(plantilla de función) |