Namespaces
Variants

std::ranges:: rbegin

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 */ rbegin = /* unspecified */ ;

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

requires /* voir ci-dessous */

constexpr std:: input_or_output_iterator auto rbegin ( T && t ) ;
(depuis C++20)

Retourne un itérateur vers le dernier élément de l'argument.

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::rbegin 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::rbegin est expression-équivalent à :

  1. decay-copy ( t. rbegin ( ) ) (jusqu'à C++23) auto ( t. rbegin ( ) ) (depuis C++23) , si cette expression est valide et que son type modélise std::input_or_output_iterator .
  2. Sinon, decay-copy ( rbegin ( t ) ) (jusqu'à C++23) auto ( rbegin ( 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::input_or_output_iterator , où la signification de rbegin est établie comme si on effectuait une recherche dépendante des arguments uniquement.
  3. Sinon, std:: make_reverse_iterator ( ranges:: end ( 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::rbegin est mal formé, ce qui peut entraîner un échec de substitution lorsque ranges :: rbegin ( 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::rbegin désigne un objet de point de personnalisation , qui est un objet fonction const 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 T est un type objet) et ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est false , l'appel à ranges::rbegin est mal formé, ce qui entraîne également un échec de substitution.

Le type de retour modélise std::input_or_output_iterator dans tous les cas.

La norme C++20 exige que si l'appel de fonction sous-jacent rbegin 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 <iostream>
#include <ranges>
#include <span>
#include <vector>
int main()
{
    std::vector<int> v = {3, 1, 4};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << '\n';
    *vi = 42; // OK
    int a[] = {-5, 10, 15};
    auto ai = std::ranges::rbegin(a);
    std::cout << *ai << '\n';
    *ai = 42; // OK
    // auto x_x = std::ranges::rbegin(std::vector{6, 6, 6});
    // mal formé : l'argument est une rvalue (voir Notes ↑)
    auto si = std::ranges::rbegin(std::span{a}); // OK
    static_assert(std::ranges::enable_borrowed_range<
        std::remove_cv_t<decltype(std::span{a})>>);
    *si = 42; // OK
}

Sortie :

4
15

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 Applicable à Comportement publié Comportement corrigé
P2602R2 C++20 il existe un mécanisme pour interdire certains rbegin non-membres trouvés par ADL suppression de ce mécanisme

Voir aussi

retourne un itérateur inverse vers une plage en lecture seule
(objet de point de personnalisation)
retourne un itérateur inverse vers le début d'un conteneur ou d'un tableau
(modèle de fonction)