最終更新日時(UTC): 2026年01月31日 04時25分25秒
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::rbegin(C++14)

    namespace std {
      template <class C>
      auto
        rbegin(C& c)
          -> decltype(c.rbegin());         // (1) C++14
      template <class C>
      constexpr auto
        rbegin(C& c)
          -> decltype(c.rbegin());         // (1) C++17
      template <class C>
      constexpr auto
        rbegin(C& c)
          noexcept(noexcept(c.rbegin()))
          -> decltype(c.rbegin());         // (1) C++26

      template <class C>
      auto
        rbegin(const C& c)
          -> decltype(c.rbegin());         // (2) C++14
      template <class C>
      constexpr auto
        rbegin(const C& c)
          -> decltype(c.rbegin());         // (2) C++17
      template <class C>
      constexpr auto
        rbegin(const C& c)
          noexcept(noexcept(c.rbegin()))
          -> decltype(c.rbegin());         // (2) C++26

      template <class T, size_t N>
      reverse_iterator<T*>
        rbegin(T (&array)[N]);             // (3) C++14
      template <class T, size_t N>
      constexpr reverse_iterator<T*>
        rbegin(T (&array)[N]) noexcept;    // (3) C++17

      template <class E>
      reverse_iterator<const E*>
        rbegin(initializer_list<E> il);    // (4) C++14

      template <class E>
      constexpr reverse_iterator<const E*>
        rbegin(initializer_list<E> il);    // (4) C++17
    }

## 概要

範囲の末尾を指す逆イテレータを取得する。

- (1) : コンテナの`rbegin()`メンバ関数で、範囲の末尾を指す、逆イテレータを返す。
- (2) : コンテナの`rbegin()`メンバ関数で、範囲の末尾を指す、読み取り専用逆イテレータを返す。
- (3) : 組み込み配列の末尾を指す、逆イテレータを返す。
- (4) : `initializer_list`オブジェクトの末尾を指す、読み取り専用逆イテレータを返す。C++26で削除。

## 戻り値

- (1) : `c.rbegin();`
- (2) : `c.rbegin();`
- (3) : `reverse_iterator<T*>(array + N)`
- (4) : `reverse_iterator<const E*>(il.end())`

## 例

    #include <iostream>
    #include <vector>
    #include <iterator>
    #include <algorithm>

    void print(int x)
    {
      std::cout << x << " ";
    }

    int main()
    {
      // コンテナ
      {
        std::vector<int> v = {1, 2, 3};

        decltype(v)::reverse_iterator first = std::rbegin(v);
        decltype(v)::reverse_iterator last = std::rend(v);

        std::for_each(first, last, print);
      }
      std::cout << std::endl;

      // 組み込み配列
      {
        int ar[] = {4, 5, 6};

        std::reverse_iterator<int*> first = std::rbegin(ar);
        std::reverse_iterator<int*> last = std::rend(ar);

        std::for_each(first, last, print);
      }
      std::cout << std::endl;

      // 初期化子リスト
      {
        std::initializer_list<int> init = {7, 8, 9};

        std::reverse_iterator<const int*> first = std::rbegin(init);
        std::reverse_iterator<const int*> last = std::rend(init);

        std::for_each(first, last, print);
      }
    }

### 出力

    3 2 1
    6 5 4
    9 8 7

## バージョン

### 言語

- C++14

### 処理系

- Clang: 3.4 ✅
- GCC: 5.0 ✅
- ICC: ??
- Visual C++: ??

## 参照

- LWG Issue 2128. Absence of global functions `cbegin`/`cend`
- P0031R0 A Proposal to Add Constexpr Modifiers to `reverse_iterator`, `move_iterator`, `array` and Range Access
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`