namespace std::ranges::views {
inline constexpr /*unspecified*/ all = /*unspecified*/; // (1)
template<viewable_range R>
using all_t = decltype(all(declval<R>())); // (2)
}
概要
- (1): Rangeへの参照として振る舞う
view
を生成するRangeアダプタクロージャオブジェクト - (2):
all
の戻り値の型を得るエイリアステンプレート
all
は、元のRange全体を表すview
。これは、view
ではないRangeをview
として扱うために利用できる。
Rangeアダプタオブジェクトでも暗黙的に使用され、それによりview
かどうかを気にせず使えるようになっている。
all
が生成するview
をまとめて"all view"という。all_t
を使えば、all
の型を得ることができる。
効果
式views::all(E)
の効果は次の通り
E
のdecay
した型がview
のモデルであれば、decay-copy(E)
と等しい- それ以外のとき、
ref_view{E}
が有効な式であれば、ref_view{E}
と等しい - それ以外のとき、
owning_view{E}
と等しい
例
#include <ranges>
#include <iostream>
int main() {
using namespace std;
int a[] = {1, 2, 3, 4, 5};
for (int i : a | views::all) {
cout << i;
}
}
xxxxxxxxxx
#include <ranges>
#include <iostream>
int main() {
using namespace std;
int a[] = {1, 2, 3, 4, 5};
for (int i : a | views::all) {
cout << i;
}
}
出力
12345
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅
参照
- N4892 24 Ranges library
- C++20 ranges
- [C++]
<ranges>
のviewを見る19 - owning_view - P2415R2 What is a
view
? (本提案文書はC++20に遡って適用されている)