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
=
|
(2) | (C++20以降) |
|
struct
view_base
{
}
;
|
(3) | (C++20以降) |
enable_view
変数テンプレートは、
range
が
view
であるかどうかを示すために使用される。
/*is-derived-from-view-interface*/
<
T
>
が
true
となるのは、
T
が何らかの型
U
に対する
ranges::
view_interface
<
U
>
を唯一の公開基底クラスとして持ち、かつ
T
が他のあらゆる型
V
に対する
ranges::
view_interface
<
V
>
を基底クラスとして持たない場合に限る。
ユーザーは
view
をモデルとするCV修飾なしのプログラム定義型に対して
enable_view
を
true
に、そうでない型に対しては
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 | 破棄の時間計算量に関する制限が厳しすぎた | 緩和された |