Namespaces
Variants

std::ranges:: data

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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)
получает указатель на базовый массив
(шаблон функции)