- ranges[meta header]
- concept[meta id-type]
- std::ranges[meta namespace]
- cpp20[meta cpp]
namespace std::ranges {
template<class T>
concept view = range<T> && movable<T> && enable_view<T>;
}- movable[link /reference/concepts/movable.md]
- enable_view[link enable_view.md]
viewは、ビューを表すコンセプトである。viewの要件は意味論要件がメインなので、enable_viewを特殊化して有効にしない限りviewとはならない。
viewの例:
- イテレータペアをラップするRange
- 要素を
shared_ptrで持っていて、Rangeのコピーをすると要素の所有権を共有するようなRange - 要素を必要に応じて生成するRange
型Tがviewのモデルとなるのは、以下の条件をすべて満たす場合である。
TのムーブコンストラクタがO(1)Tのムーブ代入は、Tのデストラクタとムーブコンストラクタを連続で実行する場合より複雑にならない- M 個の要素を持つ
T型のオブジェクトから N 個のT型オブジェクトをムーブやコピーで作ったとき、それら N 個のT型オブジェクトは O(N + M) で破棄できる copy_constructible<T>がfalse、またはTのコピーコンストラクタがO(1)copyable<T>がfalse、またはTのコピー代入はTのデストラクタとコピーコンストラクタを連続で実行する場合より複雑にならない
viewとborrowed_rangeには直接の包含関係はないが、要素を所有していると一般にこれらの要件は満たせないため、borrowed_rangeでもある場合が多い。
viewを自作する場合、view_interfaceを基底クラスにすると便利である。
#include <ranges>
#include <string_view>
#include <span>
#include <vector>
int main()
{
// vectorはviewではない
static_assert(!std::ranges::view<std::vector<int>>);
// string_viewはview
static_assert(std::ranges::view<std::string_view>);
// spanはview
static_assert(std::ranges::view<std::span<int>>);
}- std::ranges::view[color ff0000]
- C++20
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ??
- Visual C++: 2019 Update 10 [mark verified]
- N4861 24 Ranges library
- C++20 ranges
- P2325R3 Views should not be required to be default constructible (本提案文書はC++20に遡って適用されている)
- P2415R2 What is a
view? (本提案文書はC++20に遡って適用されている)