Namespaces
Variants

std::ranges:: rend

From cppreference.net
Ranges library
Range adaptors
定義先ヘッダ <ranges>
定義先ヘッダ <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ rend = /* unspecified */ ;

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

requires /* 下記参照 */
constexpr std:: sentinel_for <

decltype ( ranges:: rbegin ( std:: declval < T > ( ) ) ) > auto rend ( T && t ) ;
(C++20以降)

逆順範囲の終端を示すセンチネルを返します。

range-rbegin-rend.svg

T が配列型であり、かつ std:: remove_all_extents_t < std:: remove_reference_t < T >> が不完全型である場合、 ranges::rend の呼び出しは不適格(ill-formed)となり、診断は不要(no diagnostic required)です。

引数が左辺値であるか、または 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)
コンテナまたは配列の逆方向終端イテレータを返す
(関数テンプレート)