std::ranges::rbegin
| 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 point de personnalisation) |
|
| Signature d'appel |
||
template< class T >
requires /* see below */
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.
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 ranges::enable_borrowed_range<std::remove_cv_t<T>> est true, alors un appel à ranges::rbegin est équivalent à une expression à :
- 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. - Sinon, decay-copy
(rbegin(t))(jusqu'à C++23)auto(rbegin(t))(depuis C++23), siTest 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 derbeginest établie comme si par recherche dépendante des arguments uniquement. - Sinon,
std::make_reverse_iterator(ranges::end(t))si à la foisranges::begin(t)etranges::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.
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
|
(C++20)
|
retourne un itérateur inverse vers une plage en lecture seule
(objet de point de personnalisation) |
|
(C++14)
|
retourne un itérateur inverse vers le début d'un conteneur ou d'un tableau
(modèle de fonction) |