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>)
- 任意の型
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 |
継承しているメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
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>
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 ✅