Spec-Zone.ru › C++

std::ranges::cdata

Определено в заголовке <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 эквивалентен выражению:

  • as-const-pointer(ranges::data(possibly-const-range(t))).

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

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

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

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

Объекты-точки настройки

Имя ranges::cdata обозначает объект-точку настройки — константный функциональный объект типа класса литерального semiregular. Подробнее см. Объект-точка настройки.

Пример

#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!

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/cdata

Spec-Zone.ru

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