Namespaces
Variants

std::ranges:: rend

From cppreference.net
Ranges library
Range adaptors
Défini dans l'en-tête <ranges>
Défini dans l'en-tête <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ rend = /* unspecified */ ;

}
(depuis C++20)
(objet de point de personnalisation)
Signature d'appel
template < class T >

requires /* voir ci-dessous */
constexpr std:: sentinel_for <

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

Retourne un sentinelle indiquant la fin d'une plage inversée.

range-rbegin-rend.svg

Si T est un type tableau et que std:: remove_all_extents_t < std:: remove_reference_t < T >> est incomplet, alors l'appel à ranges::rend est mal formé, aucun diagnostic requis.

Si l'argument est une lvalue ou si ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est true , alors un appel à ranges::rend est expression-équivalent à :

  1. decay-copy ( t. rend ( ) ) (jusqu'à C++23) auto ( t. rend ( ) ) (depuis C++23) , si cette expression est valide et que son type modélise std:: sentinel_for < decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > .
  2. Sinon, decay-copy ( rend ( t ) ) (jusqu'à C++23) auto ( rend ( t ) ) (depuis C++23) , si T est un type classe ou énumération, que cette expression est valide et que son type modélise std:: sentinel_for < decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > , où la signification de rend est établie comme si on effectuait une recherche dépendante des arguments uniquement.
  3. Sinon, std:: make_reverse_iterator ( ranges:: begin ( t ) ) si à la fois ranges:: begin ( t ) et ranges:: end ( t ) sont des expressions valides, ont le même type, et que ce type modélise std::bidirectional_iterator .

Dans tous les autres cas, un appel à ranges::rend est mal formé, ce qui peut entraîner un échec de substitution lorsque ranges :: rend ( t ) apparaît dans le contexte immédiat d'une instanciation de modèle.

Table des matières

Objets de point de personnalisation

Le nom ranges::rend désigne un objet de point de personnalisation , qui est un objet fonction constant d'un type de classe littéral semiregular . Voir CustomizationPointObject pour plus de détails.

Notes

Si l'argument est une rvalue (c'est-à-dire que T est un type objet) et que ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est false , ou s'il s'agit d'un type tableau de taille inconnue, l'appel à ranges::rend est mal formé, ce qui entraîne également un échec de substitution.

Si ranges :: rend ( std:: forward < T > ( t ) ) est valide, alors decltype ( ranges :: rend ( std:: forward < T > ( t ) ) ) et decltype ( ranges:: begin ( std:: forward < T > ( t ) ) ) modélisent std::sentinel_for dans tous les cas, tandis que T modélise std::ranges::range .

La norme C++20 exige que si l'appel sous-jacent à la fonction rend retourne une prvalue, la valeur de retour soit construite par déplacement à partir de l'objet temporaire matérialisé. Toutes les implémentations retournent directement la prvalue à la place. L'exigence est corrigée par la proposition post-C++20 P0849R8 pour correspondre aux implémentations.

Exemple

#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";
}

Sortie :

found a 5 in array a!

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
P2602R2 C++20 il existe un mécanisme pour interdire certaines fonctions non-membres rend trouvées par ADL suppression de ce mécanisme

Voir aussi

retourne un itérateur inverse de fin vers une plage en lecture seule
(objet de point de personnalisation)
retourne un itérateur inverse vers une plage
(objet de point de personnalisation)
(C++14)
retourne un itérateur inverse de fin pour un conteneur ou un tableau
(fonction template)