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 класса типа. Для удобства изложения, неквалифицированная версия его типа обозначается как __data_fn.
Все экземпляры __data_fn равны. Воздействие вызова различных экземпляров типа __data_fn с одними и теми же аргументами эквивалентно, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицирован ли он как const (хотя экземпляр с квалификатором volatile необязательно должен быть вызываемым). Таким образом, ranges::data можно свободно копировать, и его копии можно использовать взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... соответствуют требованиям аргументов для ranges::data выше, __data_fn соответствует
-
std::invocable<__data_fn, Args...>, -
std::invocable<const __data_fn, Args...>, -
std::invocable<__data_fn&, Args...>, и -
std::invocable<const __data_fn&, Args...>.
В противном случае, никакой оператор вызова функции __data_fn не участвует в разрешении перегрузки.
Примечания
Если аргумент — rvalue (т.е. T — тип объекта) и ranges::enable_borrowed_range<std::remove_cv_t<T>> является false, вызов ranges::data некорректен, что также приводит к отказу от подстановки.
Если ranges::data(e) корректно для выражения e, то оно возвращает указатель на объект.
Стандарт C++20 требует, чтобы если базовый вызов функции data возвращает prvalue, возвращаемое значение создавалось путем перемещения из временного объекта. Все реализации возвращают prvalue напрямую. Требование исправлено в предложении после C++20 P0849R8, чтобы соответствовать реализациям.
Пример
#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/w/cpp/ranges/data