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. Подробности см. в разделе 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!

См. также

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/cpp/ranges/data

Spec-Zone.ru

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