std::ranges::begin
| ヘッダ <ranges> で定義 |
||
| ヘッダ <iterator> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* 未指定 */ begin = /* 未指定 */; |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(C++20以降) | |
引数への最初の要素へのイテレータを返します。
引数が左辺値であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>> が true の場合、ranges::begin の呼び出しは
- t + 0 と式等価です(t が配列型の場合)。
- std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型の場合、
ranges::beginの呼び出しは ill-formed であり、診断は要求されません。
- std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型の場合、
- それ以外の場合、
t.begin()を呼び出し、その結果の型が std::input_or_output_iterator をモデル化する場合、decay-copy(t.begin())(C++23まで)auto(t.begin())(C++23以降)。 - それ以外の場合、
Tがクラス型または列挙型であり、引数依存名前探索のみによって確立されるbeginの意味でbegin(t)を呼び出し、その結果の型が std::input_or_output_iterator をモデル化する場合、decay-copy(begin(t))(C++23まで)auto(begin(t))(C++23以降)。
上記以外の場合、ranges::begin の呼び出しは ill-formed となり、テンプレートインスタンス化の即時コンテキストで呼び出しが現れると、SFINAE を引き起こす可能性があります。
目次 |
カスタマイゼーションポイントオブジェクト
ranges::begin という名前は、const であり、リテラルな semiregular クラス型の**カスタマイゼーションポイントオブジェクト**を表します。説明のため、その型の cv-修飾されていないバージョンを __begin_fn と表記します。
__begin_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __begin_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が左辺値か右辺値か、const 修飾されているかどうかに関わらず等価です(ただし、volatile 修飾されたインスタンスが呼び出し可能である必要はありません)。したがって、ranges::begin は自由にコピーでき、そのコピーは相互に交換可能です。
型のセット Args... が与えられた場合、ranges::begin への引数に対する要件を std::declval<Args>()... が満たす場合、__begin_fn は以下をモデル化します。
- std::invocable<__begin_fn, Args...>,
- std::invocable<const __begin_fn, Args...>,
- std::invocable<__begin_fn&, Args...>、および
- std::invocable<const __begin_fn&, Args...>.
それ以外の場合、__begin_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] Notes
引数が右辺値(つまり T がオブジェクト型)で、ranges::enable_borrowed_range<std::remove_cv_t<T>> が false の場合、ranges::begin の呼び出しは ill-formed となり、これも substitution failure を引き起こします。
すべてのケースで、戻り値の型は std::input_or_output_iterator をモデル化します。
C++20 標準では、基になる begin 関数呼び出しが prvalue を返す場合、戻り値はマテリアライズされた一時オブジェクトからムーブ構築されることが要求されています。すべての実装は直接 prvalue を返します。この要件は、C++20 後に提案された P0849R8 によって、実装に合わせるように修正されています。
[編集] Example
#include <cassert> #include <ranges> #include <vector> int main() { std::vector v{3, 1, 4}; auto vi = std::ranges::begin(v); auto vci = std::ranges::cbegin(v); assert(*vi == 3 and *vi == *vci); ++vi; ++vci; // OK: vci is modifiable object *vi = 42; // OK: vi points to mutable element // *vci = 13; // Error: vci points to immutable element int a[]{-5, 10, 15}; auto ai = std::ranges::begin(a); // works with C-arrays as well assert(*ai == -5); *ai = 42; // OK }
[編集] Defect reports
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2602R2 | C++20 | ADL によって見つけられる特定の非メンバ begin を禁止する仕組みがありました。 |
その仕組みは削除されました。 |
[編集] See also
| (C++20) |
読み取り専用rangeの先頭を指すイテレータを返す (カスタマイゼーションポイントオブジェクト) |
| (C++11)(C++14) |
コンテナまたは配列の先頭を指すイテレータを返す (関数テンプレート) |