std::ranges::rbegin
| ヘッダ <ranges> で定義 |
||
| ヘッダ <iterator> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* 未指定 */ rbegin = /* 未指定 */; |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(C++20以降) | |
引数の最後の要素へのイテレータを返します。
T が配列型で、std::remove_all_extents_t<std::remove_reference_t<T>> が不完全な場合、ranges::rbegin の呼び出しは ill-formed であり、診断は不要です。
引数が lvalue であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>> が true である場合、ranges::rbegin の呼び出しは、その式の型が std::input_or_output_iterator をモデル化する場合、以下の式と式等価です。
- decay-copy(t.rbegin())(C++23まで)auto(t.rbegin())(C++23以降), この式が有効で、その型が std::input_or_output_iterator をモデル化する場合。
- それ以外の場合、
Tがクラス型または列挙型で、decay-copy(rbegin(t))(C++23まで)auto(rbegin(t))(C++23以降) の呼び出しが有効で、その型が std::input_or_output_iterator をモデル化する場合、引数依存名前探索のみで確立されたrbeginの意味での以下の式と式等価です。 - それ以外の場合、std::make_reverse_iterator(ranges::end(t))。ただし、ranges::begin(t) と ranges::end(t) の両方が有効な式であり、同じ型を持ち、その型が std::bidirectional_iterator をモデル化する場合。
上記以外の場合、ranges::rbegin の呼び出しは ill-formed です。これは、ranges::rbegin(t) がテンプレートインスタンテーションの直接のコンテキストに現れる場合に 置換失敗 を引き起こす可能性があります。
目次 |
カスタマイゼーションポイントオブジェクト
ranges::rbegin という名前は、const で リテラル な semiregular クラス型の *カスタマイズポイントオブジェクト* を指します。説明のため、その型の cv 修飾されていないバージョンを __rbegin_fn と表します。
__rbegin_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __rbegin_fn 型のインスタンスを呼び出した場合の効果は、インスタンスを表す式が lvalue か rvalue か、また const 修飾されているかどうかにかかわらず同等です(ただし、volatile 修飾されたインスタンスの呼び出しは保証されません)。したがって、ranges::rbegin は自由にコピーでき、そのコピーは相互に交換可能です。
型 Args... のセットが与えられた場合、std::declval<Args>()... が上記の ranges::rbegin の引数要件を満たす場合、__rbegin_fn は以下をモデル化します。
- std::invocable<__rbegin_fn, Args...>,
- std::invocable<const __rbegin_fn, Args...>,
- std::invocable<__rbegin_fn&, Args...>、および
- std::invocable<const __rbegin_fn&, Args...>.
それ以外の場合、__rbegin_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] ノート
引数が rvalue(つまり T がオブジェクト型)で、ranges::enable_borrowed_range<std::remove_cv_t<T>> が false である場合、ranges::rbegin の呼び出しは ill-formed であり、これも置換失敗につながります。
返される型は、すべての場合において std::input_or_output_iterator をモデル化します。
C++20 標準では、基になる rbegin 関数呼び出しが prvalue を返す場合、返り値は具現化された一時オブジェクトから move-construct されることが要求されています。すべての実装では、代わりに prvalue を直接返しています。この要件は、実装に合わせるために、C++20 以降の提案 P0849R8 によって修正されました。
[編集] 例
#include <iostream> #include <ranges> #include <span> #include <vector> int main() { std::vector<int> v = {3, 1, 4}; auto vi = std::ranges::rbegin(v); std::cout << *vi << '\n'; *vi = 42; // OK int a[] = {-5, 10, 15}; auto ai = std::ranges::rbegin(a); std::cout << *ai << '\n'; *ai = 42; // OK // auto x_x = std::ranges::rbegin(std::vector{6, 6, 6}); // ill-formed: the argument is an rvalue (see Notes ↑) auto si = std::ranges::rbegin(std::span{a}); // OK static_assert(std::ranges::enable_borrowed_range< std::remove_cv_t<decltype(std::span{a})>>); *si = 42; // OK }
出力
4 15
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2602R2 | C++20 | ADL によって見つかる特定の非メンバ rbegin を禁止する仕組みがあります。 |
その仕組みは削除されました。 |
[編集] 関連項目
| (C++20) |
読み取り専用rangeへの逆イテレータを返す (カスタマイゼーションポイントオブジェクト) |
| (C++14) |
コンテナまたは配列の先頭を指す逆順イテレータを返す (function template) |