Namespaces
Variants

std::ranges::data

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
Definido en el encabezado <ranges>
Definido en el encabezado <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ data = /* unspecified */;
}
(desde C++20)
(objeto punto de personalización)
Signatura de llamada
template< class T >
    requires /* see below */
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 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 equivalente a una expresión:

  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 objeto.
  2. En caso contrario, std::to_address(ranges::begin(t)), si la expresión ranges::begin(t) es válida y su tipo satisface el concepto std::contiguous_iterator.

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

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)