Namespaces
Variants

std::ranges::rend

ja.cppreference.net より
 
 
Rangesライブラリ
範囲アダプタ
 
ヘッダ <ranges>
で定義<iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ rend = /* unspecified */;
}
(C++20以上)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグネチャ
template< class T >
    requires /* see below */
constexpr std::sentinel_for<
    decltype(ranges::rbegin(std::declval<T>()))> auto rend( T&& t );
(C++20以上)

逆順範囲の終端を示す番兵を返します。

T が配列型であり std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型である場合、ranges::rend の呼び出しは不良形式となり、診断は不要です。

引数が左辺値であるか、ranges::enable_borrowed_range<std::remove_cv_t<T>> が true である場合、ranges::rend の呼び出しは以下に対して式と等価です:

  1. decay-copy(t.rend())(C++23未満)auto(t.rend())(C++23以上)。ただし、その式が有効であり、その型が std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> をモデル化する場合に限ります。
  2. そうでない場合、decay-copy(rend(t))(C++23未満)auto(rend(t))(C++23以上)。ただし、T がクラス型または列挙型であり、その式が有効であり、その型が std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> をモデル化する場合に限ります。ここで rend の意味は、実引数依存の名前検索のみによって確定されます。
  3. そうでない場合、std::make_reverse_iterator(ranges::begin(t))。ただし、ranges::begin(t) と ranges::end(t) がどちらも有効な式であり、同じ型を持ち、その型が std::bidirectional_iterator をモデル化する場合に限ります。

その他のすべての場合、ranges::rend の呼び出しは不良形式となり、置換失敗を引き起こす可能性があります(ranges::rend(t) がテンプレートのインスタンス化の直接の文脈に現れる場合)。

カスタマイゼーションポイントオブジェクト

名前 ranges::rend は カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト のconstな リテラル semiregular クラス型である。詳細は CustomizationPointObject を参照。

注記

引数が右辺値(すなわち T がオブジェクト型)であり、かつ ranges:: enable_borrowed_range < std:: remove_cv_t < T >> が false である場合、または未知のサイズの配列型である場合、 ranges::rend の呼び出しは不適格となり、これは置換失敗も引き起こします。

ranges :: rend ( std:: forward < T > ( t ) ) が有効な場合、 decltype ( ranges :: rend ( std:: forward < T > ( t ) ) ) と decltype ( ranges:: begin ( std:: forward < T > ( t ) ) ) はすべての場合において std::sentinel_for をモデルし、 T は std::ranges::range をモデルする。

C++20標準では、基となる rend 関数呼び出しがprvalueを返す場合、戻り値は具体化された一時オブジェクトからmove構築されることが要求されます。すべての実装は直接prvalueを返します。この要求は、実装に合わせるためにポストC++20提案 P0849R8 によって修正されました。

例

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main()
{
    std::vector<int> v = {3, 1, 4};
    namespace ranges = std::ranges;
    if (ranges::find(ranges::rbegin(v), ranges::rend(v), 5) != ranges::rend(v))
        std::cout << "found a 5 in vector v!\n";
    int a[] = {5, 10, 15};
    if (ranges::find(ranges::rbegin(a), ranges::rend(a), 5) != ranges::rend(a))
        std::cout << "found a 5 in array a!\n";
}

出力:

found a 5 in array a!

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2602R2 C++20 ADL によって発見される特定の非メンバーrendを禁止する仕組みが存在する そのような仕組みを削除

関連項目

読み取り専用範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)
範囲の逆方向イテレータを返す
(カスタマイゼーションポイントオブジェクト)
(C++14)
コンテナまたは配列の逆方向終端イテレータを返す
(関数テンプレート)