std::ranges::sized_range, std::ranges::disable_sized_range
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< class T > concept sized_range = ranges::range<T> && |
(1) | (C++20以降) |
| template< class > constexpr bool disable_sized_range = false; |
(2) | (C++20以降) |
2)
disable_sized_range は、size 関数(メンバまたは非メンバ)を提供するが、実際には sized_range をモデル化しないレンジ型を使用できるようにするために存在します。ユーザーは、cv-unqualified なプログラム定義型に対して disable_sized_range を特殊化できます。このような特殊化は、定数式で使用可能で、型は const bool である必要があります。目次 |
[編集] 意味論的要件
1) std::remove_reference_t<T> 型の左辺値
t が与えられた場合、T は sized_range をモデル化するのは、以下の場合のみです。- ranges::size(t)
- は償却定数時間計算量であり、
- 等価性保存式に観測可能な方法で
tの値を変更せず、 - (ranges::distance(ranges::begin(t), ranges::end(t)))に等しく、
- かつ、ranges::iterator_t<T> が
forward_iteratorをモデル化する場合、ranges::size(t) は ranges::begin(t) の評価に関係なく well-defined です。(つまり、単一パスの sized range は、begin の最初の呼び出し前のみ size の呼び出しをサポートする可能性がありますが、forward range は常に size をサポートする必要があります)。
[編集] 注釈
disable_sized_range は、イテレータとセンチネルが sized_sentinel_for を満たすレンジをオプトアウトするために使用することはできません。代わりに std::disable_sized_sentinel_for を使用する必要があります。
disable_sized_range は、配列型または参照型に対して特殊化することはできません。
[編集] 例
このコードを実行
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
[編集] 関連項目
| (C++20) |
イテレータ型が random_access_iterator を満たすrangeを規定する(コンセプト) |
| (C++20) |
イテレータ型が contiguous_iterator を満たすrangeを規定する(コンセプト) |