std::ranges::data
Определено в заголовочном файле <ranges> | ||
|---|---|---|
Определено в заголовочном файле <iterator> | ||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ data = /* unspecified */;
}
| (начиная с C++20) (объект точки настройки) | |
| Сигнатура вызова | ||
template< class T >
requires /* see below */
constexpr std::remove_reference_t<
ranges::range_reference_t<T>>* data( T&& t );
| (начиная с C++20) |
Возвращает указатель на первый элемент непрерывного диапазона.
Если T является типом массива, а std::remove_all_extents_t<std::remove_reference_t<T>> является неполным типом, вызов ranges::data некорректен; диагностика не требуется.
Если аргумент является lvalue или ranges::enable_borrowed_range<std::remove_cv_t<T>> — это true, вызов ranges::data эквивалентен выражению:
-
decay-copy(t.data())(до C++23)auto(t.data())(начиная с C++23), если это выражение корректно и его тип является указателем на объектный тип. - В противном случае —
std::to_address(ranges::begin(t)), если выражениеranges::begin(t)корректно и его тип моделируетstd::contiguous_iterator.
Во всех остальных случаях вызов ranges::data некорректен, что может привести к ошибке подстановки, если ranges::data(e) появляется в непосредственном контексте инстанцирования шаблона.
Объекты точек настройки
Имя ranges::data обозначает объект точки настройки, представляющий собой константный функциональный объект типа класса литерального semiregular. Подробности см. в разделе CustomizationPointObject.
Примечания
Если аргумент является rvalue (т. е. T является объектным типом), а ranges::enable_borrowed_range<std::remove_cv_t<T>> — это false, вызов ranges::data некорректен, что также приводит к ошибке подстановки.
Если ranges::data(e) корректно для выражения e, оно возвращает указатель на объект.
Стандарт C++20 требует, чтобы, если нижележащий вызов функции data возвращает prvalue, возвращаемое значение конструировалось перемещением из материализованного временного объекта. Все реализации напрямую возвращают prvalue. Это требование было исправлено предложением P0849R8, принятым после C++20, чтобы привести стандарт в соответствие с реализациями.
Пример
#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
std::string s{"Hello world!\n"};
char a[20]; // storage for a C-style string
std::strcpy(a, std::ranges::data(s));
// [data(s), data(s) + size(s)] is guaranteed to be an NTBS
std::cout << a;
}
Вывод:
Hello world!
См. также
|
(C++20) | получает указатель на начало доступного только для чтения непрерывного диапазона (объект точки настройки) |
|
(C++20) | возвращает итератор на начало диапазона (объект точки настройки) |
|
(C++17) | получает указатель на базовый массив (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/data