Namespaces
Variants

std::ranges:: rbegin

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

inline constexpr /* unspecified */ rbegin = /* unspecified */ ;

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

requires /* see below */

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 の呼び出しは不適格となり、診断は不要です。

引数が左辺値であるか、または ranges:: enable_borrowed_range < std:: remove_cv_t < T >> true である場合、 ranges::rbegin の呼び出しは 式等価 です:

  1. decay-copy ( t. rbegin ( ) ) (C++23まで) auto ( t. rbegin ( ) ) (C++23から) 、その式が有効であり、その型が std::input_or_output_iterator をモデル化する場合。
  2. それ以外の場合、 decay-copy ( rbegin ( t ) ) (C++23まで) auto ( rbegin ( t ) ) (C++23から) 、ただし T がクラス型または列挙型であり、その式が有効であり、その型が 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 の呼び出しは不適格となり、テンプレートのインスタンス化の直接の文脈内で ranges :: rbegin ( t ) が現れる場合、 置換失敗 を引き起こす可能性があります。

目次

翻訳内容: - "Contents" → "目次" - "Customization point objects" → 翻訳せず(C++専門用語のため) - "Notes" → "注記" - "Example" → "例" - "Defect reports" → "欠陥報告" - "See also" → "関連項目" HTMLタグ、属性、
タグ内のテキストは翻訳せず、元のフォーマットを保持しています。

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

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

注記

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

戻り値の型はすべての場合において std::input_or_output_iterator をモデル化します。

C++20標準では、基となる rbegin 関数呼び出しがprvalueを返す場合、戻り値は具体化された一時オブジェクトからmove構築されることが要求されます。しかし、すべての実装では直接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 特定の非メンバー rbegin を禁止する機構が存在する ADL によって発見される そのような機構を削除

関連項目

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