std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
定義先ヘッダ
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
t
)
{
|
(C++20以降) | |
range
コンセプトは、範囲の要素を示すイテレータと番兵を提供することで、その要素に対する反復処理を可能にする型の要件を定義します。
目次 |
セマンティック要件
式
E
が
decltype
(
(
E
)
)
の型が
T
であるとき、
T
が
range
をモデルするのは以下の場合に限られます
-
[ranges:: begin ( E ),ranges:: end ( E ))は レンジ を表し、 - ranges:: begin ( E ) および ranges:: end ( E ) の両方が償却定数時間であり、 等価性保存 式から観測可能な方法で E の値を変更せず、かつ
-
ranges::
begin
(
E
)
の型が
forward_iteratorをモデル化する場合、 ranges:: begin ( E ) は 等価性保存 である(言い換えれば、前方イテレータはマルチパスアルゴリズムをサポートする)。
注記
典型的な
range
クラスは、次の2つの関数のみを提供する必要があります:
-
begin()メンバ関数で、その戻り値の型がinput_or_output_iteratorコンセプトをモデルするもの。 -
end()メンバ関数で、その戻り値の型がsentinel_for<It>コンセプトをモデルするもの。ここでItはbegin()の戻り値の型である。
あるいは、非メンバ関数として定義され、 argument-dependent lookup によって発見されることもあります。
例
#include <ranges> // 最小限の範囲 struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // 範囲ではない: begin/endがない struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // 範囲ではない: beginがinput_or_output_iteratorを返さない struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3915 | C++20 |
ranges::
begin
(
t
)
および
ranges::
end
(
t
)
は暗黙的な式バリエーションを要求していなかった |
冗長な記述を
削除した |