Namespaces
Variants

std::ranges:: data

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

inline constexpr /* no especificado */ data = /* no especificado */ ;

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

requires /* ver más abajo */
constexpr std:: remove_reference_t <

ranges:: range_reference_t < T >> * data ( T && t ) ;
(desde C++20)

Devuelve un puntero al primer elemento de un rango contiguo.

Si T es un tipo de array y std:: remove_all_extents_t < std:: remove_reference_t < T >> está incompleto, entonces la llamada a ranges::data está mal formada, no se requiere diagnóstico.

Si el argumento es un lvalue o ranges:: enable_borrowed_range < std:: remove_cv_t < T >> es true , una llamada a ranges::data es expression-equivalent a:

  1. decay-copy ( t. data ( ) ) (hasta C++23) auto ( t. data ( ) ) (desde C++23) , si esa expresión es válida y su tipo es un puntero a un tipo de objeto.
  2. De lo contrario, std:: to_address ( ranges:: begin ( t ) ) , si la expresión ranges:: begin ( t ) es válida y su tipo modela std::contiguous_iterator .

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

Contenidos

Objetos de punto de personalización

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

Notas

Si el argumento es un rvalue (es decir, T es un tipo objeto) y ranges:: enable_borrowed_range < std:: remove_cv_t < T >> es false , la llamada a ranges::data está mal formada, lo que también resulta en fallo de sustitución.

Si ranges :: data ( e ) es válido para una expresión e , entonces devuelve un puntero a un objeto.

El estándar C++20 requiere que si la llamada a la función subyacente data devuelve un prvalue, el valor de retorno se construye por movimiento desde el objeto temporal materializado. Todas las implementaciones devuelven directamente el prvalue en su lugar. El requisito se corrige mediante la propuesta posterior a C++20 P0849R8 para coincidir con las implementaciones.

Ejemplo

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // almacenamiento para una cadena estilo C
    std::strcpy(a, std::ranges::data(s));
    // [data(s), data(s) + size(s)] está garantizado que es un NTBS
    std::cout << a;
}

Salida:

Hello world!

Véase también

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