std::ranges::views::as_const, std::ranges::as_const_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::view V > requires ranges::input_range<V> |
(1) | (C++23から) |
| namespace views { inline constexpr /* 未指定 */ as_const = /* 未指定 */; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++23から) | |
2) RangeAdaptorObject。サブ式を e とし、T を decltype((e)) とし、U を std::remove_cvref_t<T> とする。このとき、式 views::as_const(e) は以下の式と式等価である。
- views::all(e)、もしそれが整形式の式であり、views::all_t<T> が
constant_rangeをモデル化する場合; - それ以外の場合、
Uが std::span<X, Extent> を表す場合、ある型XとあるエクステントExtentに対して std::span<const X, Extent>(e); - それ以外の場合、
Uがある型Xに対して ranges::ref_view<X> を表し、const X がconstant_rangeをモデル化する場合、ranges::ref_view(static_cast<const X&>(e.base())); - それ以外の場合、
eが左辺値であり、const U がconstant_rangeをモデル化し、Uがviewをモデル化しない場合、ranges::ref_view(static_cast<const U&>(e))。 - それ以外の場合、as_const_view{e}。
as_const_view は常に constant_range をモデル化し、基本となるビュー V がそれぞれのコンセプトをモデル化する場合、contiguous_range、random_access_range、bidirectional_range、forward_range、borrowed_range、common_range、および sized_range をモデル化する。
目次 |
[編集] データメンバ
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
[編集] メンバ関数
as_const_view を構築する(public member function) | |
基本となるビュー V を返す(public member function) | |
as_const_view の開始イテレータを返す(public member function) | |
as_const_view の終了イテレータを返す(public member function) | |
| ビューが有界である場合、そのサイズを返す (public member function) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する( std::ranges::view_interface<D> の公開メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
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から) |
1) デフォルトメンバ初期化子 (= V()) を介して
base_ を値初期化する。2)
base_ を std::move(base) で初期化する。パラメータ
| 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から) |
基本となるビューを返す。
1) 基本となるビューから結果をコピー構築する。 return base_; と等価。
2) 基本となるビューから結果をムーブ構築する。 return std::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から) |
ビューの定数イテレータを返す。
1,2) return ranges::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から) |
ビューの定数番兵を返す。
1,2) return ranges::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から) |
ビューが有界である場合、そのサイズを返す。
1,2) return ranges::size(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>> = |
(C++23から) | |
std::ranges::enable_borrowed_range のこの特殊化により、基本となるビューがそれを満たす場合、as_const_view は borrowed_range を満たすようになる。
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_as_const |
202207L |
(C++23) | ranges::as_const_view, std::const_iterator |
[編集] 例
このコードを実行
#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 }
[編集] 関連項目
各要素を右辺値にキャストするシーケンスの view(クラステンプレート) (rangeアダプタオブジェクト) | |
| (C++20) |
読み取り専用rangeの先頭を指すイテレータを返す (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
読み取り専用rangeの終端を示す番兵を返す (カスタマイゼーションポイントオブジェクト) |
| (C++17) |
引数への const 参照を取得する (関数テンプレート) |
| (C++23) |
イテレータを定数イテレータに変換するイテレータアダプタ (クラステンプレート) |