Namespaces
Variants

std::ranges::cdata

С ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
Определено в заголовке <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) непрерывного диапазона, обозначенного квалифицированным const(до 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)
получает указатель на базовый массив
(шаблон функции)