Namespaces
Variants

std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base

From cppreference.net
Ranges library
Range adaptors
定義済みヘッダー <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以降)
1) view コンセプトは、範囲アダプタパイプラインの構築に使用するのに適した意味的特性を持つ range 型の要件を指定します。
2) 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 でなければならない。
3) view_base から派生することで、 range 型は view をモデル化できるようになります。

目次

セマンティック要件

1) 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 型の例としては:

コピー可能なコンテナ、例えば 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 破棄の時間計算量に関する制限が厳しすぎた 緩和された