Spec-Zone.ru › C++

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 является эквивалентным с точки зрения выражения:

  1. decay-copy(t.data())(до C++23)auto(t.data())(с C++23), если это выражение корректно и его тип — указатель на тип объекта.
  2. В противном случае, 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!

См. также

ranges::cdata
(C++20)
получает указатель на начало только для чтения непрерывного диапазона
(объект точки кастомизации)
ranges::begin
(C++20)
возвращает итератор в начало диапазона
(объект точки кастомизации)
data
(C++17)
получает указатель на базовый массив
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/data

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API