- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp23[meta cpp]
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アダプタオブジェクト
| borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
| ※ |
※ |
|
○ |
※ |
※ |
※ |
※ |
※ |
○ |
○ |
- (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)
#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
}
}
- views::as_const[color ff0000]