Namespaces
Variants

std::ranges:: cdata

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <ranges>
Определено в заголовочном файле <iterator>
inline namespace /*unspecified*/ {

inline constexpr /*unspecified*/ cdata = /*unspecified*/ ;

}
(начиная с C++20)
(объект точки кастомизации)
Сигнатура вызова
template < class T >

requires /* see below */

constexpr /* see below */ cdata ( T && t ) ;
(начиная с C++20)

Возвращает указатель на первый элемент константного типа (начиная с C++23) непрерывного диапазона, заданного константно-квалифицированным (до C++23) аргументом.

Пусть CT будет

  • const std:: remove_reference_t < T > & если аргумент является lvalue (т.е. T является ссылочным типом lvalue),
  • const T в противном случае.

Вызов ranges::cdata является эквивалентным по выражению к ranges:: data ( static_cast < CT && > ( t ) ) .

Возвращаемый тип эквивалентен std:: remove_reference_t < ranges:: range_reference_t < CT >> * .

(до C++23)

Если аргумент является lvalue или ranges:: enable_borrowed_range < std:: remove_cv_t < T >> равно true , тогда вызов ranges::cdata является эквивалентным по выражению следующему:

Тип возвращаемого значения эквивалентен std:: remove_reference_t < ranges:: range_const_reference_t < T >> * .

Во всех остальных случаях вызов ranges::cdata является некорректным, что может привести к ошибке подстановки , когда вызов появляется в непосредственном контексте инстанцирования шаблона.

(начиная с C++23)

Если ranges :: cdata ( t ) валидно, то возвращается указатель на объект константного типа (начиная с C++23) .

Объекты точек кастомизации

Имя ranges::cdata обозначает объект точки кастомизации , который является константным функциональным объектом типа литерального semiregular класса. Для подробностей см. CustomizationPointObject .

Пример

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string src {"hello world!\n"};
//  std::ranges::cdata(src)[0] = 'H'; // error, src.data() is treated as read-only
    std::ranges::data(src)[0] = 'H'; // OK, src.data() is a non-const storage
    char dst[20]; // storage for a C-style string
    std::strcpy(dst, std::ranges::cdata(src));
    // [data(src), data(src) + size(src)] is guaranteed to be an NTBS
    std::cout << dst;
}

Вывод:

Hello world!

Смотрите также

получает указатель на начало непрерывного диапазона
(объект точки кастомизации)
(C++17)
получает указатель на базовый массив
(шаблон функции)