Skip to content

Latest commit

 

History

History
68 lines (54 loc) · 2.54 KB

borrowed_range.md

File metadata and controls

68 lines (54 loc) · 2.54 KB

borrowed_range

  • ranges[meta header]
  • concept[meta id-type]
  • std::ranges[meta namespace]
  • cpp20[meta cpp]
namespace std::ranges {
  template<class T>
  concept borrowed_range = range<T> && (is_lvalue_reference_v<T> || enable_borrowed_range<remove_cvref_t<T>>);
}
  • range[link range.md]
  • is_lvalue_reference_v[link /reference/type_traits/is_lvalue_reference.md]
  • enable_borrowed_range[link enable_borrowed_range.md]

概要

borrowed_rangeは、Rangeを所有しないrangeを表すコンセプトである。Rangeオブジェクトの左辺値参照はborrowed_rangeである。

左辺値参照以外の型が値を所有するか否かは構文要件で定義できないため、変数テンプレートenable_borrowed_rangeを特殊化してtrueとなるようにすることでborrowed_rangeを満たすようにする。

モデル

decltype((t))Tであるような式tがあるとする。Tborrowed_rangeのモデルとなるのは、tが示すオブジェクトの寿命とそこから取得したイテレータの有効性が結びついていない場合である。

備考

borrowed_rangeなRangeはそのイテレータの有効性がRangeの寿命と結びついていないため、そのようなRangeを値で受け取ってイテレータを値で返すような関数がダングリングイテレータの心配なく利用できる。

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

int main()
{
  // vectorは要素を所有しているので、borrowed_rangeではない
  static_assert(!std::ranges::borrowed_range<std::vector<int>>);

  // vectorの参照は要素を所有していないので、borrowed_rangeである
  static_assert(std::ranges::borrowed_range<std::vector<int>&>);

  // string_viewは文字列を所有していないので、borrowed_rangeである
  static_assert(std::ranges::borrowed_range<std::string_view>);

  // spanは文字列を所有していないので、borrowed_rangeである
  static_assert(std::ranges::borrowed_range<std::span<int>>);
}
  • std::ranges::borrowed_range[color ff0000]

出力

バージョン

言語

  • C++20

処理系

参照