最終更新日時: 2026年07月22日 13時45分20秒 (JST)
rotarymars が更新

履歴 編集

class template
<ranges>

# std::ranges::as_rvalue_view(C++23)

    namespace std::ranges {
      template<view V>
        requires (input_range<V>)
      class as_rvalue_view : public view_interface<as_rvalue_view<V>> { …… }; // (1)

      namespace views {
        inline constexpr /*unspecified*/ as_rvalue = /*unspecified*/;      // (2)
      }
    }

## 概要

- (1): 要素をrvalueにする`view`
- (2): `as_rvalue_view`または同じ効果を実現する`view`を生成するRangeアダプタオブジェクト

この`view`は、あるRangeの要素をムーブして別のコンテナに挿入する場合などに利用できる。

    std::vector<std::string> words = {"the", "quick", "brown", "fox", "ate", "a", "pterodactyl"};
    std::vector<std::string> new_words;
    std::ranges::copy(words | views::as_rvalue, std::back_inserter(new_words));

### Rangeコンセプト

borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
※ | ※ | ※ | ※ | ※ | ※ | ※ | ※ | ※ | ○ | ○

※ 参照先のRangeに従う

## テンプレートパラメータ制約

- `view<V>`
- `!common_range<V>`
- `copyable<iterator_t<V>>`

## 効果

- (2): 式`views::as_rvalue(E)`はRangeアダプタオブジェクトを表し、その効果は次の通り
  - 要素がすでに右辺値参照であれば(`T = decltype((E))`として、`same_as<range_rvalue_reference_t<T>, range_reference_t<T>>`)、`views::all(E)`と等しい
  - それ以外のとき、`as_rvalue_view{E}`と等しい

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++23
`base` | 元となるRangeを取得する | C++23
`begin` | 先頭を指すイテレータを取得する | C++23
`end` | 番兵を取得する | C++23
`size` | 要素数を取得する | C++23
`reserve_hint` | 要素数の近似値を取得する | C++26

`r`を参照先のRangeとする。`size`は、`ranges::size(r)`が有効な式であるときに定義される。

## 継承しているメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | Rangeが空かどうかを判定する | C++20
`operator bool` | Rangeが空でないかどうかを判定する | C++20
`data` | Rangeの先頭へのポインタを取得する | C++20
`front` | 先頭要素への参照を取得する | C++20
`back` | 末尾要素への参照を取得する | C++20
`operator[]` | 要素へアクセスする | C++20
`cbegin` | 定数イテレータを取得する | C++23
`cend` | 定数イテレータ（番兵）を取得する | C++23

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++23

## 例

    #include <ranges>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <print>
    #include <string>

    int main() {
      std::vector<std::string> words = {"the", "quick", "brown", "fox", "ate", "a", "pterodactyl"};
      std::vector<std::string> new_words;
      std::ranges::copy(words | std::views::as_rvalue, std::back_inserter(new_words));
      std::println("{}", new_words);
    }

### 出力

    ["the", "quick", "brown", "fox", "ate", "a", "pterodactyl"]

## 実装例

    namespace std::ranges {
      template<view V>
        requires input_range<V>
      class as_rvalue_view : public view_interface<as_rvalue_view<V>> {
        V base_ = V();      // exposition only

      public:
        as_rvalue_view() requires default_initializable<V> = default;
        constexpr explicit as_rvalue_view(V base);

        constexpr V base() const & requires copy_constructible<V> { return base_; }
        constexpr V base() && { return std::move(base_); }

        constexpr auto begin() requires (!simple-view<V>) {
          return move_iterator(ranges::begin(base_));
        }

        constexpr auto begin() const requires range<const V> {
          return move_iterator(ranges::begin(base_));
        }

        constexpr auto end() requires (!simple-view<V>) {
          if constexpr (common_range<V>) {
            return move_iterator(ranges::end(base_));
          } else {
            return move_sentinel(ranges::end(base_));
          }
        }

        constexpr auto end() const requires range<const V> {
          if constexpr (common_range<const V>) {
            return move_iterator(ranges::end(base_));
          } else {
            return move_sentinel(ranges::end(base_));
          }
        }

        constexpr auto size() requires sized_range<V> { return ranges::size(base_); }
        constexpr auto size() const requires sized_range<const V> { return ranges::size(base_); }
      };

      template<class R>
        as_rvalue_view(R&&) -> as_rvalue_view<views::all_t<R>>;
    }

    constexpr explicit as_rvalue_view(V base);

## バージョン

### 言語

- C++23

### 処理系

- Clang: 17 ✅
- GCC: 13 ✅
- Visual C++: 2022 Update 4 ✅

## 参照

- P2446R2 `views::as_rvalue`