std::ranges::sized_range, std::ranges::disable_sized_range
ja.cppreference.net より
| ヘッダ <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
で定義 (1) | (C++20以上) (C++26未満) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(C++26以上) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (C++20以上) |
1)
sized_rangeコンセプトは、range(C++26未満)approximately_sized_range(C++26以上)型のうち、size関数を用いて定数時間でそのサイズが分かるものの要件を指定します。2)
disable_sized_rangeは、size関数(メンバまたは非メンバとして)を提供するものの、実際にはsized_rangeをモデル化しないレンジ型の使用を許可するために存在します。ユーザーは、cv修飾されていないプログラム定義型に対して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 であること(すなわち、シングルパスのサイズ指定範囲は最初の begin 呼び出し前のみ size の呼び出しをサポートしてもよいが、フォワード範囲は常に size をサポートしなければならない)。
注記
disable_sized_range
は、イテレータと番兵が
sized_sentinel_for
を満たす範囲のオプトアウトには使用できません。
std::disable_sized_sentinel_for
を代わりに使用する必要があります。
disable_sized_range
は配列型または参照型に対して特殊化できません。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range および ranges::reserve_hint |
例
このコードを実行
#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
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
イテレータ型が
contiguous_iterator
を満たす範囲を指定する
(コンセプト) |