std::ranges::data
| Определён в заголовке <ranges>
|
||
| Определён в заголовке <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ data = /* unspecified */;
}
|
(since C++20) (объект точки настройки) |
|
| Сигнатура вызова |
||
template< class T >
requires /* see below */
constexpr std::remove_reference_t<
ranges::range_reference_t<T>>* data( T&& t );
|
(since 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 вместо этого. Требование исправлено пост-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)
|
получает указатель на базовый массив
(шаблон функции) |