std::ranges::data
| 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:
- 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. - En caso contrario,
std::to_address(ranges::begin(t)), si la expresiónranges::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
|
(C++20)
|
obtiene un puntero al inicio de un rango contiguo de solo lectura
(objeto de punto de personalización) |
|
(C++20)
|
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) |