最終更新日時(UTC):
が更新

履歴 編集

concept
<ranges>

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

namespace std::ranges {
  template<class T>
  concept borrowed_range = range<T> && (is_lvalue_reference_v<T> || enable_borrowed_range<remove_cvref_t<T>>);
}

概要

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

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

モデル

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

備考

borrowed_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>>);
}

出力

バージョン

言語

  • C++20

処理系

参照