Namespaces
Variants

std::ranges::data

De fr.cppreference.net
 
 
Bibliothèque de ranges
Adaptateurs de ranges
 
Défini dans l'en-tête <ranges>
Défini dans l'en-tête <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ data = /* unspecified */;
}
(depuis C++20)
(objet point de personnalisation)
Signature d'appel
template< class T >
    requires /* see below */
constexpr std::remove_reference_t<
    ranges::range_reference_t<T>>* data( T&& t );
(depuis C++20)

Retourne un pointeur vers le premier élément d'un range contigu.

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

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

  1. decay-copy(t.data())(jusqu'à C++23)auto(t.data())(depuis C++23), si cette expression est valide et son type est un pointeur vers un type objet.
  2. Sinon, std::to_address(ranges::begin(t)), si l'expression ranges::begin(t) est valide et son type modélise std::contiguous_iterator.

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

Objets de point de personnalisation

Le nom ranges::data 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 que T est un type objet) et que ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est false , l'appel à ranges::data est mal formé, ce qui entraîne également un échec de substitution.

Si ranges :: data ( e ) est valide pour une expression e , alors il renvoie un pointeur vers un objet.

La norme C++20 exige que si l'appel de fonction sous-jacent data 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 <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // stockage pour une chaîne de style C
    std::strcpy(a, std::ranges::data(s));
    // [data(s), data(s) + size(s)] est garanti d'être un NTBS
    std::cout << a;
}

Sortie :

Hello world!

Voir aussi

obtient un pointeur vers le début d'une plage contiguë en lecture seule
(objet de point de personnalisation)
retourne un itérateur vers le début d'une plage
(objet de point de personnalisation)
(C++17)
obtient le pointeur vers le tableau sous-jacent
(modèle de fonction)