最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

type-alias
<ranges>

# std::ranges::borrowed_iterator_t(C++20)

    namespace std::ranges {
      template<range R>
      using borrowed_iterator_t = conditional_t<borrowed_range<R>, iterator_t<R>, dangling>;
    }

## 概要

任意のRange型`R`のイテレータの型を取得する。ただし、`R`が`borrowed_range`ではない場合、`dangling`になる。

イテレータを返す関数では、これを戻り値型に使うことでダングリングイテレータになる場合に自動的に`dangling`を返すことができる。

## 例

    #include <ranges>
    #include <vector>

    using namespace std;

    template<ranges::range R>
    ranges::borrowed_iterator_t<R> my_find(R&& r, const ranges::range_value_t<R>& v) {
      auto i = ranges::begin(r);
      auto e = ranges::end(r);
      while(i != e) {
        if(*i == v) return i;
        ++i;
      }
      return e;
    }

    vector<int> f(){ return {}; }

    int main() {
      // borrowed_rangeではないRangeのrvalueが渡された場合、danglingが返る
      auto result1 = my_find(f(), 42);
      static_assert(same_as<decltype(result1), ranges::dangling>);

      // lvalueが渡された場合、danglingにはならない
      auto vec = f();
      auto result2 = my_find(vec, 42);
      static_assert(same_as<decltype(result2), vector<int>::iterator>);

      // borrowed_rangeのrvalueが渡された場合、danglingにはならない
      auto result3 = my_find(ranges::subrange{vec}, 42);
      static_assert(same_as<decltype(result3), vector<int>::iterator>);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

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

## 参照

- N4861 24 Ranges library
- C++20 ranges