Namespaces
Variants

std::ranges:: cdata

From cppreference.net
Ranges library
Range adaptors
Definiert im Header <ranges>
Definiert im Header <iterator>
inline namespace /*unspecified*/ {

inline constexpr /*unspecified*/ cdata = /*unspecified*/ ;

}
(seit C++20)
(Customization Point Object)
Aufrufsignatur
template < class T >

requires /* see below */

constexpr /* see below */ cdata ( T && t ) ;
(seit C++20)

Gibt einen Zeiger auf das erste Element konstanten Typs (since C++23) eines zusammenhängenden Bereichs zurück, der durch ein const-qualifiziertes (until C++23) Argument bezeichnet wird.

Sei CT definiert als

  • const std:: remove_reference_t < T > & falls das Argument ein Lvalue ist (d.h. T ist ein Lvalue-Referenztyp),
  • const T andernfalls.

Ein Aufruf von ranges::cdata ist ausdrucksäquivalent zu ranges:: data ( static_cast < CT && > ( t ) ) .

Der Rückgabetyp entspricht std:: remove_reference_t < ranges:: range_reference_t < CT >> * .

(bis C++23)

Wenn das Argument ein Lvalue ist oder ranges:: enable_borrowed_range < std:: remove_cv_t < T >> true ist, dann ist ein Aufruf von ranges::cdata ausdrucksäquivalent zu:

Der Rückgabetyp entspricht std:: remove_reference_t < ranges:: range_const_reference_t < T >> * .

In allen anderen Fällen ist ein Aufruf von ranges::cdata fehlerhaft, was zu einem Substitutionsfehler führen kann, wenn der Aufruf im unmittelbaren Kontext einer Template-Instanziierung erscheint.

(seit C++23)

Wenn ranges :: cdata ( t ) gültig ist, dann gibt es einen Zeiger auf ein Objekt konstanten Typs (seit C++23) zurück.

Customization Point Objects

Der Name ranges::cdata bezeichnet ein Customization Point Object , welches ein konstantes Funktionsobjekt eines Literal semiregular -Klassentyps ist. Weitere Details finden Sie unter CustomizationPointObject .

Beispiel

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string src {"hello world!\n"};
//  std::ranges::cdata(src)[0] = 'H'; // error, src.data() is treated as read-only
    std::ranges::data(src)[0] = 'H'; // OK, src.data() is a non-const storage
    char dst[20]; // storage for a C-style string
    std::strcpy(dst, std::ranges::cdata(src));
    // [data(src), data(src) + size(src)] is guaranteed to be an NTBS
    std::cout << dst;
}

Ausgabe:

Hello world!

Siehe auch

erhält einen Zeiger auf den Anfang eines zusammenhängenden Bereichs
(Anpassungspunktobjekt)
(C++17)
erhält den Zeiger auf das zugrundeliegende Array
(Funktionstemplate)