std::ranges::views::as_const, std::ranges::as_const_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::view V >
requires ranges::input_range<V>
class as_const_view
: public ranges::view_interface<as_const_view<V>>
| (1) | (начиная с C++23) |
namespace views {
inline constexpr /* unspecified */ as_const = /* unspecified */;
}
| (2) | (начиная с C++23) |
| Сигнатура вызова | ||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto as_const( R&& r );
| (начиная с C++23) |
view, которое также является constant_range. as_const_view всегда содержит элементы только для чтения (если диапазон не пуст).e является подвыражением, T — это decltype((e)), а U — это std::remove_cvref_t<T>. Тогда выражение views::as_const(e) эквивалентно выражению: -
views::all(e), если это корректное выражение иviews::all_t<T>моделируетconstant_range; - в противном случае —
std::span<const X, Extent>(e)для некоторого типаXи некоторого размераExtent, еслиUобозначаетstd::span<X, Extent>; - в противном случае —
ranges::ref_view(static_cast<const X&>(e.base())), еслиUобозначаетranges::ref_view<X>для некоторого типаX, а constX моделируетconstant_range; - в противном случае —
ranges::ref_view(static_cast<const U&>(e)), еслиeявляется lvalue, constU моделируетconstant_range, аUне моделируетview. - в противном случае —
as_const_view{e}.
as_const_view всегда моделирует constant_range, а также моделирует contiguous_range, random_access_range, bidirectional_range, forward_range, borrowed_range, common_range и sized_range, если базовое представление V моделирует соответствующие концепции.
Поля данных
| Поле | Описание |
|---|---|
V base_ (закрытое) | базовое представление (пояснительный объект-член*) |
Функции-члены
создаёт as_const_view (открытая функция-член) |
|
возвращает базовое представление V (открытая функция-член) |
|
возвращает итератор начала as_const_view (открытая функция-член) |
|
возвращает итератор конца as_const_view (открытая функция-член) |
|
| возвращает размер представления, если оно ограничено (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер базового approximately_sized_range (открытая функция-член) |
Унаследовано от |
|
возвращает признак того, что производное представление пусто; доступна, только если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает сентинел для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
возвращает признак того, что производное представление не пусто; доступна, только если к нему применимо ranges::empty (открытая функция-член std::ranges::view_interface<D>) |
|
получает адрес данных производного представления; доступна, только если тип его итератора удовлетворяет contiguous_iterator (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает первый элемент производного представления, если оно удовлетворяет forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает последний элемент производного представления; доступна, только если оно удовлетворяет bidirectional_range и common_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает элемент производного представления с индексом nth; доступна, только если оно удовлетворяет random_access_range (открытая функция-член std::ranges::view_interface<D>) |
|
std::ranges::as_const_view::as_const_view
as_const_view() requires std::default_initializable<V> = default; | (1) | (начиная с C++23) |
constexpr explicit as_const_view( V base ); | (2) | (начиная с C++23) |
base_ с помощью инициализатора члена по умолчанию (= V()).Параметры
| base | - | представление |
std::ranges::as_const_view::base
constexpr V base() const& requires std::copy_constructible<V>; | (1) | (начиная с C++23) |
constexpr V base() &&; | (2) | (начиная с C++23) |
Возвращает базовое представление.
return base_ ;.returnstd::move(base_ );.std::ranges::as_const_view::begin
constexpr auto begin() requires (!/*simple_view*/<V>); | (1) | (начиная с C++23) |
constexpr auto begin() const requires ranges::range<const V>; | (2) | (начиная с C++23) |
Возвращает константный итератор представления. Эквивалентно returnranges::cbegin(base_ );.
std::ranges::as_const_view::end
constexpr auto end() requires (!/*simple_view*/<V>); | (1) | (начиная с C++23) |
constexpr auto end() const requires ranges::range<const V>; | (2) | (начиная с C++23) |
Возвращает константный сентинел представления. Эквивалентно returnranges::cend(base_ );.
std::ranges::as_const_view::size
constexpr auto size() requires ranges::sized_range<V>; | (1) | (начиная с C++23) |
constexpr auto size() const requires ranges::sized_range<const V>; | (2) | (начиная с C++23) |
Возвращает размер представления, если оно ограничено. Эквивалентно returnranges::size(base_ );.
std::ranges::as_rvalue_view::reserve_hint
constexpr auto reserve_hint()
requires ranges::approximately_sized_range<V>;
| (1) | (начиная с C++26) |
constexpr auto reserve_hint() const
requires ranges::approximately_sized_range<const V>;
| (2) | (начиная с C++26) |
Возвращает ranges::reserve_hint(base_ ).
Направляющие вывода
template< class R > as_const_view( R&& ) -> as_const_view<views::all_t<R>>; | (начиная с C++23) |
Вспомогательные шаблоны
template< class T >
constexpr bool enable_borrowed_range<std::ranges::as_const_view<T>> =
ranges::enable_borrowed_range<T>;
| (начиная с C++23) |
Эта специализация ranges::enable_borrowed_range позволяет as_const_view удовлетворять требованиям borrowed_range, если им удовлетворяет базовое представление.
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_as_const | 202207L | (C++23) |
ranges::as_const_view, std::const_iterator |
__cpp_lib_ranges_reserve_hint | 202502L | (C++26) |
ranges::approximately_sized_range и reserve_hint |
Пример
#include <cassert>
#include <ranges>
int main()
{
int x[]{1, 2, 3, 4, 5};
auto v1 = x | std::views::drop(2);
assert(v1.back() == 5);
v1[0]++; // OK, can modify non-const element
auto v2 = x | std::views::drop(2) | std::views::as_const;
assert(v2.back() == 5);
// v2[0]++; // Compile-time error, cannot modify read-only element
}
См. также
|
(C++23) | view последовательности, преобразующее каждый элемент в rvalue(шаблон класса) (объект-адаптер диапазона) |
|
(C++20) | возвращает итератор на начало диапазона только для чтения (объект-точка настройки) |
|
(C++20) | возвращает сентинел, обозначающий конец диапазона только для чтения (объект-точка настройки) |
|
(C++17) | получает ссылку на аргумент типа const (шаблон функции) |
|
(C++23) | адаптер итератора, преобразующий итератор в константный итератор (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/as_const_view