Namespaces
Variants

std::ranges::data

С ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
Определён в заголовке <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 является эквивалентным выражению:

  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 класса. Для подробностей см. 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++17)
получает указатель на базовый массив
(шаблон функции)