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 типа. Для целей изложения, неквалифицированная версия его типа обозначается как __cdata_fn.

Все экземпляры __cdata_fn равны. Эффекты вызова различных экземпляров типа __cdata_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и имеет ли он квалификатор const или нет (однако экземпляр с volatile-квалификатором не обязан быть вызываемым). Таким образом, ranges::cdata можно свободно копировать, и его копии можно использовать взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяет требованиям к аргументам для ranges::cdata выше, __cdata_fn моделирует

  • std::invocable<__cdata_fn, Args...>,
  • std::invocable<const __cdata_fn, Args...>,
  • std::invocable<__cdata_fn&, Args...>, и
  • std::invocable<const __cdata_fn&, Args...>.

В противном случае, оператор вызова функции __cdata_fn не участвует в разрешении перегрузки.

Пример

#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/w/cpp/ranges/cdata

Spec-Zone.ru

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