Skip to content

Latest commit

 

History

History
81 lines (65 loc) · 3.59 KB

File metadata and controls

81 lines (65 loc) · 3.59 KB

viewable_range

  • ranges[meta header]
  • concept[meta id-type]
  • std::ranges[meta namespace]
  • cpp20[meta cpp]
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>))));
}
  • is_lvalue_reference_v[link /reference/type_traits/is_lvalue_reference.md]
  • movable[link /reference/concepts/movable.md]
  • is-initializer-list[italic]

概要

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>&>);
}
  • std::ranges::viewable_range[color ff0000]
  • std::ranges::empty_view[link /reference/ranges/empty_view.md]

出力

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.0 [mark verified]
  • GCC: 10.1.0 [mark verified]
  • ICC: ??
  • Visual C++: 2019 Update 10 [mark verified]

参照