名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
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) (C++23から)
namespace views {

    inline constexpr /* 未指定 */ as_const = /* 未指定 */;

}
(2) (C++23から)
呼び出しシグネチャ
template< ranges::viewable_range R >

    requires /* 以下を参照 */

constexpr ranges::view auto as_const( R&& r );
(C++23から)
1) 基本となる view のビューを表す範囲アダプタで、constant_range でもある。as_const_view は常に読み取り専用の要素を持つ (空でない場合)。
2) RangeAdaptorObject。サブ式を e とし、Tdecltype((e)) とし、Ustd::remove_cvref_t<T> とする。このとき、式 views::as_const(e) は以下の式と式等価である。
  • views::all(e)、もしそれが整形式の式であり、views::all_t<T>constant_range をモデル化する場合;
  • それ以外の場合、Ustd::span<X, Extent> を表す場合、ある型 X とあるエクステント Extent に対して std::span<const X, Extent>(e);
  • それ以外の場合、U がある型 X に対して ranges::ref_view<X> を表し、const Xconstant_range をモデル化する場合、ranges::ref_view(static_cast<const X&>(e.base()));
  • それ以外の場合、e が左辺値であり、const Uconstant_range をモデル化し、Uview をモデル化しない場合、ranges::ref_view(static_cast<const U&>(e))
  • それ以外の場合、as_const_view{e}

as_const_view は常に constant_range をモデル化し、基本となるビュー V がそれぞれのコンセプトをモデル化する場合、contiguous_rangerandom_access_rangebidirectional_rangeforward_rangeborrowed_rangecommon_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_rangecommon_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>> =

    ranges::enable_borrowed_range<T>;
(C++23から)

std::ranges::enable_borrowed_range のこの特殊化により、基本となるビューがそれを満たす場合、as_const_viewborrowed_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アダプタオブジェクト)[編集]
読み取り専用rangeの先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeの終端を示す番兵を返す
(カスタマイゼーションポイントオブジェクト)[編集]
(C++17)
引数への const 参照を取得する
(関数テンプレート) [編集]
イテレータを定数イテレータに変換するイテレータアダプタ
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)