std::ranges::view, std::ranges::enable_view, std::ranges::view_base
| ヘッダ <ranges>
|
||
template<class T>
concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>;
|
で定義 (1) | (C++20 以降) |
template<class T>
constexpr bool enable_view =
std::derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
|
(2) | (C++20 以降) |
struct view_base { };
|
(3) | (C++20 以降) |
enable_view は、range が view であるかどうかを示すために使用されます。 /*is-derived-from-view-interface*/<T> は、true が以下を満たす場合に限り T となります。すなわち、ある型 ranges::view_interface<U> に対して U がちょうど1つのパブリック基底クラス T を持ち、なおかつ他の任意の型 ranges::view_interface<V> に対して V が型
の基底クラスを持たない場合です。
enable_viewユーザーは、true をモデル化する cv 修飾されていないプログラム定義型に対して view を、モデル化しない型に対しては false を特殊化できます。そのような特殊化は 定数式で使用可能 であり、型 const bool を持たなければなりません。
セマンティック要件
T
が
view
をモデル化するのは、以下の場合に限る:
-
Tのムーブ構築が定数時間計算量を持つこと、および -
N
個のコピーおよび/またはムーブが
M
個の要素を保持する
Tオブジェクトから作成された場合、これらの N 個のオブジェクトの破棄が 𝓞(N+M) となること(これはムーブされたviewオブジェクトの破棄が 𝓞(1) であることを意味する)、および -
std::
copy_constructible
<
T
>
が
false
であるか、または
Tのコピー構築が定数時間計算量を持つこと、および -
std::
copyable
<
T
>
が
false
であるか、または
Tのコピー代入の時間計算量が破棄後にコピー構築を行う場合を超えないこと。
特殊化
以下の標準テンプレートのすべての特殊化に対する
enable_view
の特殊化は
true
として定義されます:
| (C++26以降) |
注記
view型の例としては:
-
イテレータのペアをラップする
range型(例: std :: ranges:: subrange < I > ) -
要素を
std::shared_ptr
で保持し、すべてのコピーと所有権を共有する
range型 -
要素をオンデマンドで生成する
range型(例: std::ranges::iota_view )
コピー可能なコンテナ、例えば
std::
vector
<
std::
string
>
は一般に
view
の意味論的要件を満たしません。なぜならコンテナのコピーはすべての要素をコピーするため、定数時間で実行することができないからです。
ビューは元々、低コストでコピー可能かつ非所有の範囲として記述されていましたが、型がviewをモデル化するためにコピー可能または非所有である必要はありません。ただし、それでもコピー(コピー可能な場合)、ムーブ、代入、破棄が低コストでなければならず、そうすることでレンジアダプタが予期しない計算量を持たないようにします。
デフォルトでは、
movable
と
range
をモデリングする型は、
view_base
から公開かつ明確に派生している場合、または
std::ranges::view_interface
の特殊化がちょうど1つある場合、viewと見なされます。
例
最小ビュー。
#include <ranges> struct ArchetypalView : std::ranges::view_interface<ArchetypalView> { int* begin(); int* end(); }; static_assert(std::ranges::view<ArchetypalView>);
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2325R3 | C++20 |
view
は
default_initializable
を要求していた
|
要求しない |
| LWG 3549 | C++20 |
enable_view
は
view_interface
からの継承を検出しなかった
|
検出する |
| P2415R2 | C++20 | 破棄の時間計算量に関する制限が厳しすぎた | 緩和された |