Namespaces
Variants

std::ranges:: data

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 /* non spécifié */ {

inline constexpr /* non spécifié */ data = /* non spécifié */ ;

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

requires /* voir ci-dessous */
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'une plage contiguë.

Si T est un type tableau et que 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 si ranges:: enable_borrowed_range < std:: remove_cv_t < T >> est true , un appel à ranges::data est expression-équivalent à :

  1. decay-copy ( t. data ( ) ) (jusqu'à C++23) auto ( t. data ( ) ) (depuis C++23) , si cette expression est valide et que son type est un pointeur vers un type d'objet.
  2. Sinon, std:: to_address ( ranges:: begin ( t ) ) , si l'expression ranges:: begin ( t ) est valide et que 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.

Table des matières

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)