最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

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`である必要がある。

## モデル

型`T`が`viewable_range`のモデルとなるのは、`T`が`range`のモデルであり、かつ`T`が`borrowed_range`のモデルであるか、`remove_cvref_t<T>`が`view`のモデルである場合である。

`borrowed_range`または`view`ではない`range`の右辺値は、`viewable_range`のモデルにはならない。

## 例

(執筆中)

### 出力

(執筆中)

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ??
- Visual C++: 2019 Update 10 ✅

## 参照

- N4861 24 Ranges library
- C++20 ranges
- LWG Issue 3481 `viewable_range` mishandles lvalue move-only views
- P2415R2 What is a `view`? (本提案文書はC++20に遡って適用されている)