GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::ranges::view - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. ranges
  3. view

最終更新日時: 2026年09月11日 13時06分31秒 (JST)
Akira Takahashi が更新

履歴 編集

concept
<ranges>

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

namespace std::ranges {
  template<class T>
  concept view = range<T> && movable<T> && enable_view<T>;
}

概要

viewは、ビューを表すコンセプトである。viewの要件は意味論要件がメインなので、enable_viewを特殊化して有効にしない限りviewとはならない。

viewの例:

  • イテレータペアをラップするRange
  • 要素をshared_ptrで持っていて、Rangeのコピーをすると要素の所有権を共有するようなRange
  • 要素を必要に応じて生成するRange

モデル

型Tがviewのモデルとなるのは、以下の条件をすべて満たす場合である。

  1. TのムーブコンストラクタがO(1)
  2. Tのムーブ代入は、Tのデストラクタとムーブコンストラクタを連続で実行する場合より複雑にならない
  3. M 個の要素を持つT型のオブジェクトから N 個のT型オブジェクトをムーブやコピーで作ったとき、それら N 個のT型オブジェクトは O(N + M) で破棄できる
  4. copy_constructible<T>がfalse、またはTのコピーコンストラクタがO(1)
  5. copyable<T>がfalse、またはTのコピー代入はTのデストラクタとコピーコンストラクタを連続で実行する場合より複雑にならない

viewとborrowed_rangeには直接の包含関係はないが、要素を所有していると一般にこれらの要件は満たせないため、borrowed_rangeでもある場合が多い。

備考

viewを自作する場合、view_interfaceを基底クラスにすると便利である。

例

#include <ranges>
#include <string_view>
#include <span>
#include <vector>

int main()
{
  // vectorはviewではない
  static_assert(!std::ranges::view<std::vector<int>>);

  // string_viewはview
  static_assert(std::ranges::view<std::string_view>);

  // spanはview
  static_assert(std::ranges::view<std::span<int>>);
}

出力

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.0 ✅
  • GCC: 10.1.0 ✅
  • Visual C++: 2019 Update 10 ✅

参照

  • N4861 24 Ranges library
  • C++20 ranges
  • P2325R3 Views should not be required to be default constructible (本提案文書はC++20に遡って適用されている)
  • P2415R2 What is a view? (本提案文書はC++20に遡って適用されている)
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.