Namespaces
Variants

std::ranges:: rend

From cppreference.net
Ranges library
Range adaptors
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 */
constexpr std:: sentinel_for <

decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > auto rend ( T && t ) ;
(desde C++20)

Devuelve un centinela que indica el final de un rango invertido.

range-rbegin-rend.svg

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:

  1. 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 > ( ) ) ) > .
  2. En caso contrario, decay-copy ( rend ( t ) ) (hasta C++23) auto ( rend ( t ) ) (desde C++23) , si T es 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 de rend se establece como si se realizara únicamente búsqueda dependiente de argumentos .
  3. 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

devuelve un iterador inverso final para un rango de solo lectura
(objeto de punto de personalización)
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)