std::ranges:: data
|
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 */
|
(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:
- 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.
- 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
|
(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) |