最終更新日時: 2026年05月22日 11時42分20秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<ranges>

# std::ranges::as_const_view(C++23)

    namespace std::ranges {
      template<view V>
        requires input_range<V>
      class as_const_view : public view_interface<as_const_view<V>> { …… }; // (1)

      namespace views {
        inline constexpr /*unspecified*/ as_const = /*unspecified*/;        // (2)
      }
    }

## 概要

- (1): 各要素を定数化したRangeとして振る舞う`view`
- (2): `as_const_view`を生成するRangeアダプタオブジェクト

### Rangeコンセプト

borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
※ | ※ |  | ○ | ※ | ※ | ※ | ※ | ※ | ○ | ○

- ※: `V`に従う

## 効果

- (2): 式`views::as_const(E)`の効果は次のいずれか（`T = decltype((E))`、`U = remove_cvref_t<T>`とする）
  - `views::all_t<T>`が`constant_range`のモデルとなる場合 : `views::all(E)`
  - 任意の型`X`に対して、`U`が`empty_view<X>`である場合 : `auto(views::empty<const X>)`
  - C++26 : 任意の型`X`に対して、`U`が`optional<X&>`である場合 : `optional<const X&>(E)`
  - 任意の型`X`と整数値`Extent`に対して、`U`が`span<X, Extent>`である場合 : `span<const X, Extent>(E)`
  - 任意の型`X`に対して、`U`が`ref_view<X>`であり、`const X`が`constant_range`のモデルとなる場合 : `ref_view(static_cast<const X&>(E.base()))`
  - `E`が左辺値であり、`const U`が`constant_range`のモデルとなり、かつ`U`は`view`のモデルとならない場合 : `ref_view(static_cast<const U&>(E))`
  - それ以外の場合 : `as_const_view(E)`

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++23
`base` | `V`の参照を取得する | C++23
`begin` | 先頭を指すイテレータを取得する | C++23
`end` | 番兵を取得する | C++23
`size` | 要素数を取得する | C++23
`reserve_hint` | 要素数の近似値を取得する | C++26

## 継承しているメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | Rangeが空かどうかを判定する | C++23
`operator bool` | Rangeが空でないかどうかを判定する | C++23
`front` | 先頭要素への参照を取得する | C++23
`back` | 末尾要素への参照を取得する | C++23
`operator[]` | 要素へアクセスする | C++23
`cbegin` | 定数イテレータを取得する | C++23
`cend` | 定数イテレータ（番兵）を取得する | C++23

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++23

## 例

    #include <ranges>
    #include <iostream>
    #include <vector>

    int main() {
      std::vector<int> vec = {1, 2, 3, 4};

      for (auto& i : vec | std::views::as_const) {
        std::cout << i << ' ';

        // 変更不可
        //i = 0
      }
    }

### 出力

    1 2 3 4

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: 13.1 ✅
- Visual C++: 2022 Update 6 ✅

## 参照

- P2278R4 `cbegin` should always return a constant iterator
- P3913R1 Optimize for `std::optional` in range adaptors
  - C++26で、入力が`optional<X&>`の場合の特殊化を追加