std::ranges:: begin
|
Défini dans l'en-tête
<ranges>
|
||
|
Défini dans l'en-tête
<iterator>
|
||
|
inline
namespace
/* unspecified */
{
inline
constexpr
/* unspecified */
begin
=
/* unspecified */
;
|
(depuis C++20)
(objet de point de personnalisation) |
|
|
Signature d'appel
|
||
|
template
<
class
T
>
requires
/* voir ci-dessous */
|
(depuis C++20) | |
Retourne un itérateur vers le premier élément de l'argument.
Si l'argument est une lvalue ou si
ranges::
enable_borrowed_range
<
std::
remove_cv_t
<
T
>>
est
true
, alors un appel à
ranges::begin
est
expression-équivalent
à :
-
t
+
0
si
t
a un type tableau.
-
Si
std::
remove_all_extents_t
<
std::
remove_reference_t
<
T
>>
est incomplet, alors l'appel à
ranges::beginest mal formé, aucun diagnostic requis.
-
Si
std::
remove_all_extents_t
<
std::
remove_reference_t
<
T
>>
est incomplet, alors l'appel à
- Sinon, decay-copy ( t. begin ( ) ) (jusqu'à C++23) auto ( t. begin ( ) ) (depuis C++23) , si cette expression est valide et que son type modélise std::input_or_output_iterator .
-
Sinon,
decay-copy
(
begin
(
t
)
)
(jusqu'à C++23)
auto
(
begin
(
t
)
)
(depuis C++23)
, si
Test 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 debeginest établie comme si on effectuait une recherche dépendante des arguments uniquement.
Dans tous les autres cas, un appel à
ranges::begin
est mal formé, ce qui peut entraîner une
défaillance de substitution
lorsque l'appel 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::begin
désigne un
objet 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
T
est un type objet) et
ranges::
enable_borrowed_range
<
std::
remove_cv_t
<
T
>>
est
false
, l'appel à
ranges::begin
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
begin
retourne une prvalue, la valeur de retour est 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 <cassert> #include <ranges> #include <vector> int main() { std::vector v{3, 1, 4}; auto vi = std::ranges::begin(v); auto vci = std::ranges::cbegin(v); assert(*vi == 3 and *vi == *vci); ++vi; ++vci; // OK : vci est un objet modifiable *vi = 42; // OK : vi pointe vers un élément mutable // *vci = 13; // Erreur : vci pointe vers un élément immuable int a[]{-5, 10, 15}; auto ai = std::ranges::begin(a); // fonctionne également avec les tableaux C assert(*ai == -5); *ai = 42; // OK }
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 certains
begin
non-membres trouvés par
ADL
|
suppression de ce mécanisme |
Voir aussi
|
(C++20)
|
retourne un itérateur vers le début d'une plage en lecture seule
(objet de point de personnalisation) |
|
(C++11)
(C++14)
|
retourne un itérateur vers le début d'un conteneur ou d'un tableau
(fonction template) |