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>
#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 ✅