Namespaces
Variants

std::ranges:: cdata

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
Definido en el encabezado <iterator>
inline namespace /*unspecified*/ {

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

}
(desde C++20)
(objeto de punto de personalización)
Firma de llamada
template < class T >

requires /* ver más abajo */

constexpr /* ver más abajo */ cdata ( T && t ) ;
(desde C++20)

Devuelve un puntero al primer elemento de tipo constante (desde C++23) de un rango contiguo denotado por un argumento calificado como const (hasta C++23) .

Sea CT

  • const std:: remove_reference_t < T > & si el argumento es un lvalue (es decir, T es un tipo de referencia lvalue),
  • const T en caso contrario.

Una llamada a ranges::cdata es equivalente-expresión a ranges:: data ( static_cast < CT && > ( t ) ) .

El tipo de retorno es equivalente a std:: remove_reference_t < ranges:: range_reference_t < CT >> * .

(hasta C++23)

Si el argumento es un lvalue o ranges:: enable_borrowed_range < std:: remove_cv_t < T >> es true , entonces una llamada a ranges::cdata es expresión-equivalente a:

El tipo de retorno es equivalente a std:: remove_reference_t < ranges:: range_const_reference_t < T >> * .

En todos los demás casos, una llamada a ranges::cdata está mal formada, lo que puede resultar en fallo de sustitución cuando la llamada aparece en el contexto inmediato de una instanciación de plantilla.

(desde C++23)

Si ranges :: cdata ( t ) es válido, entonces retorna un puntero a un objeto de tipo constante (desde C++23) .

Objetos de punto de personalización

El nombre ranges::cdata denota un objeto de punto de personalización , que es un objeto función constante de un tipo de clase literal semiregular . Consulte CustomizationPointObject para más detalles.

Ejemplo

#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;
}

Salida:

Hello world!

Véase también

obtiene un puntero al inicio de un rango contiguo
(objeto de punto de personalización)
(C++17)
obtiene el puntero al array subyacente
(plantilla de función)