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).
|
Пусть
Вызов Тип возвращаемого значения эквивалентен |
(до C++23) |
|
Если аргумент является lvalue или
Тип возвращаемого значения эквивалентен Во всех остальных случаях вызов |
(с 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!
См. также
|
(C++20) |
получает указатель на начало непрерывного диапазона (объект точки кастомизации) |
|
(C++17) |
получает указатель на базовую массив (шаблонная функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/cdata