最終更新日時(UTC):
が更新

履歴 編集

class template
<ranges>

std::ranges::owning_view(C++20)

namespace std::ranges {
  template<range R>
    requires movable<R> && (!is-initializer-list<R>)
  class owning_view : public view_interface<owning_view<R>> { …… };
}

概要

Rangeの右辺値をムーブして所有するview。このクラスのオブジェクトは、Rangeアダプタallによって生成される。

Rangeコンセプト

borrowed sized output input forward bidirectional random_access contiguous common viewable view

※ 参照先のRangeに従う

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ C++20
base Rの参照を取得する C++20
begin 先頭を指すイテレータを取得する C++20
end 番兵を取得する C++20
empty Rangeが空かどうかを判定する C++20
size 要素数を取得する C++20
data Rangeの先頭へのポインタを取得する C++20

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

継承しているメンバ関数

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

推論補助

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

#include <ranges>
#include <vector>
#include <iostream>

int main() {
  auto ov1 = std::views::all(std::vector<int>{1, 2, 3});
  for (int n : ov1) {
    std::cout << n;  // 123
  }

  std::cout << '\n';

  auto ov2 = std::vector<int>{1, 2, 3} | std::views::all;
  for (int n : ov2) {
    std::cout << n;  // 123
  }
}

出力

123
123

実装例

namespace std::ranges {
  template<range R>
    requires movable<R> && (!is-initializer-list<R>)
  class owning_view : public view_interface<owning_view<R>> {
  private:
    R r_ = R();
  public:
    owning_view() requires default_initializable<R> = default;
    constexpr owning_view(R&& t) : r_(std::move(t)) {}

    owning_view(owning_view&&) = default;
    owning_view& operator=(owning_view&&) = default;

    constexpr R& base() & noexcept { return r_; }
    constexpr const R& base() const & noexcept { return r_; }
    constexpr R&& base() && noexcept { return std::move(r_); }
    constexpr const R&& base() const && noexcept { return std::move(r_); }

    constexpr iterator_t<R> begin() { return ranges::begin(r_); }
    constexpr sentinel_t<R> end() { return ranges::end(r_); }

    constexpr auto begin() const requires range<const R> {
      return ranges::begin(r_);
    }
    constexpr auto end() const requires range<const R> {
      return ranges::end(r_);
    }

    constexpr bool empty() requires requires { ranges::empty(r_); } {
      return ranges::empty(r_);
    }
    constexpr bool empty() const requires requires { ranges::empty(r_); } {
      return ranges::empty(r_);
    }

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

    constexpr auto data() requires contiguous_range<R> {
      return ranges::data(r_);
    }
    constexpr auto data() const requires contiguous_range<const R> {
      return ranges::data(r_);
    }
  };
}

バージョン

言語

  • C++20

処理系

参照