最終更新日時:
が更新

履歴 編集

concept
<ranges>

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

namespace std::ranges {
  template<class T>
  concept viewable_range =
    range<T> &&
    ((view<remove_cvref_t<T>> && constructible_from<remove_cvref_t<T>, T>) ||
     (!view<remove_cvref_t<T>> &&
      (is_lvalue_reference_v<T> || (movable<remove_reference_t<T>> && !is-initializer-list<T>))));
}

概要

viewable_rangeは、安全にviewへ変換できるRangeを表すコンセプトである。

Rangeアダプタを適用するには、viewable_rangeである必要がある。

モデル

Tviewable_rangeのモデルとなるのは、Trangeのモデルであり、かつ以下のいずれかを満たす場合である。

viewでも左辺値でもないrangeの右辺値のうち、ムーブできないものはviewable_rangeのモデルにはならない。

#include <ranges>
#include <vector>
#include <initializer_list>

int main()
{
  using V = std::vector<int>;

  // 左辺値のRangeはviewable_range
  static_assert(std::ranges::viewable_range<V&>);

  // 右辺値でも、ムーブ可能なRangeならviewable_range
  static_assert(std::ranges::viewable_range<V&&>);

  // viewはそれ自体viewable_range
  static_assert(std::ranges::viewable_range<std::ranges::empty_view<int>>);

  // initializer_listの右辺値は、danglingを避けるためviewable_rangeにならない
  static_assert(!std::ranges::viewable_range<std::initializer_list<int>>);
  // 左辺値なら参照先が存続するのでviewable_rangeになる
  static_assert(std::ranges::viewable_range<std::initializer_list<int>&>);
}

出力

バージョン

言語

  • C++20

処理系

参照