Namespaces
Variants

std::ranges::views::as_const, std::ranges::as_const_view

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
ヘッダ <ranges>
template< ranges::view V >
    requires ranges::input_range<V>
class as_const_view
    : public ranges::view_interface<as_const_view<V>>
で定義 (1)
namespace views {
    inline constexpr /* unspecified */ as_const = /* unspecified */;
}
(C++23 以上) (2)
(C++23 以上)
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto as_const( R&& r );
呼び出しシグネチャ
(C++23 以上)1) 元となる view もまた constant_rangeas_const_view であるようなビューを表す range アダプタ。
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 をモデル化する場合;
  • そうでなければ、ある型 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 が const Xconstant_range をモデル化する場合の ;
  • そうでなければ、ranges::ref_view(static_cast<const U&>(e)) が左辺値であり、e が const Uconstant_range をモデル化し、かつ が Uview をモデル化しない場合の ;
  • そうでなければ、as_const_view{e}。

as_const_view は常に constant_range をモデル化し、元となるビュー がそれぞれのコンセプトをモデル化する場合、contiguous_range、random_access_range、bidirectional_range、forward_range、borrowed_range、common_range、および sized_rangeV をモデル化する。

データメンバ

メンバー 説明
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)
基になる approximately_sized_range の近似サイズを返す
(public member function)
から継承 ranges::view_interface
派生ビューが空であるかどうかを返す。ただし、それが以下を満たす場合に限る 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>)
返す n番目の 要素 (派生ビュー内の) ただし、それが以下を満たす場合に限る 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) (since C++23)
constexpr explicit as_const_view ( V base ) ;
(2) (since C++23)
1) base_ を値初期化します(デフォルトメンバ初期化子 = V ( ) による)。
2) base_ を std :: move ( base ) で初期化します。

パラメータ

base - ビュー

std::ranges::as_const_view:: base

constexpr V base ( ) const & requires std:: copy_constructible < V > ;
(1) (since C++23)
constexpr V base ( ) && ;
(2) (since C++23)

基になるビューを返します。

1) 基になるビューから結果をコピー構築します。 return base_  ; と等価です。
2) 基になるビューから結果をムーブ構築します。 return std :: move ( base_  ) ; と等価です。

std::ranges::as_const_view:: begin

constexpr auto begin ( ) requires ( ! /*simple_view*/ < V > ) ;
(1) (since C++23)
constexpr auto begin ( ) const requires ranges:: range < const V > ;
(2) (since C++23)

ビューの定数イテレータを返します。 return ranges:: cbegin ( base_  ) ; と等価です。

std::ranges::as_const_view:: end

constexpr auto end ( ) requires ( ! /*simple_view*/ < V > ) ;
(1) (since C++23)
constexpr auto end ( ) const requires ranges:: range < const V > ;
(2) (since C++23)

ビューの定数センチネルを返します。 return ranges:: cend ( base_  ) ; と等価です。

std::ranges::as_const_view:: size

constexpr auto size ( ) requires ranges:: sized_range < V > ;
(1) (since C++23)
constexpr auto size ( ) const requires ranges:: sized_range < const V > ;
(2) (since C++23)

ビューが有界である場合、そのサイズを返します。次と等価です: return ranges:: size ( base_  ) ; 。

std::ranges::as_rvalue_view:: reserve_hint

constexpr auto reserve_hint ( )
requires ranges :: approximately_sized_range < V > ;
(1) (since C++26)
constexpr auto reserve_hint ( ) const
requires ranges :: approximately_sized_range < const V > ;
(2) (since C++26)

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 の特殊化は、基になるビューが 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: 非const要素は変更可能
    auto v2 = x | std::views::drop(2) | std::views::as_const;
    assert(v2.back() == 5);
    // v2[0]++; // コンパイル時エラー: 読み取り専用要素は変更不可
}

関連項目

各要素を右辺値にキャストするシーケンスの view
(クラステンプレート) (範囲アダプタオブジェクト)
読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)
(C++17)
引数への const 参照を取得する
(関数テンプレート)
イテレータを定数イテレータに変換するイテレータアダプタ
(クラステンプレート)