名前空間
変種
操作

std::ranges::rbegin

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
inline namespace /* 未指定 */ {

    inline constexpr /* 未指定 */ rbegin = /* 未指定 */;

}
(C++20以降)
(カスタマイズポイントオブジェクト)
呼び出しシグネチャ
template< class T >

    requires /* 以下を参照 */

constexpr std::input_or_output_iterator auto rbegin( T&& t );
(C++20以降)

引数の最後の要素へのイテレータを返します。

range-rbegin-rend.svg

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 をモデル化する場合、以下の式と式等価です。

  1. decay-copy(t.rbegin())(C++23まで)auto(t.rbegin())(C++23以降), この式が有効で、その型が std::input_or_output_iterator をモデル化する場合。
  2. それ以外の場合、T がクラス型または列挙型で、decay-copy(rbegin(t))(C++23まで)auto(rbegin(t))(C++23以降) の呼び出しが有効で、その型が std::input_or_output_iterator をモデル化する場合、引数依存名前探索のみで確立された rbegin の意味での以下の式と式等価です。
  3. それ以外の場合、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 は以下をモデル化します。

それ以外の場合、__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 を禁止する仕組みがあります。 その仕組みは削除されました。

[編集] 関連項目

読み取り専用rangeへの逆イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
コンテナまたは配列の先頭を指す逆順イテレータを返す
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)