namespace std::ranges {
template<range R>
using borrowed_subrange_t = conditional_t<borrowed_range<R>, subrange<iterator_t<R>>, dangling>;
}
概要
任意のRange型R
の部分Rangeの型を取得する。ただし、R
がborrowed_range
ではない場合、dangling
になる。
例
#include <ranges>
#include <vector>
using namespace std;
template<ranges::range R>
ranges::borrowed_subrange_t<R> my_all(R&& r) {
auto i = ranges::begin(r);
auto e = ranges::end(r);
return {i, e};
}
vector<int> f(){ return {}; }
int main() {
// borrowed_rangeではないRangeのrvalueが渡された場合、danglingが返る
auto result1 = my_all(f());
static_assert(same_as<decltype(result1), ranges::dangling>);
// lvalueが渡された場合、danglingにはならない
auto vec = f();
auto result2 = my_all(vec);
static_assert(!same_as<decltype(result2), ranges::dangling>);
// borrowed_rangeのrvalueが渡された場合、danglingにはならない
auto result3 = my_all(ranges::subrange{vec});
static_assert(!same_as<decltype(result3), ranges::dangling>);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅