Skip to content

Commit 7c33393

Browse files
committed
<ranges> ダングリングイテレータハンドリングの例を追加 #713
1 parent af4f314 commit 7c33393

File tree

3 files changed

+85
-4
lines changed

3 files changed

+85
-4
lines changed

reference/ranges/borrowed_iterator_t.md

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,54 @@ namespace std::ranges {
1616
* dangling[link dangling.md]
1717
1818
## 概要
19-
2019
任意の範囲型`R`のイテレータの型を取得する。ただし、`R`が[`borrowed_range`](borrowed_range.md)ではない場合、[`dangling`](dangling.md)になる。
2120
21+
イテレータを返す関数では、これを戻り値型に使うことでダングリングイテレータになる場合に自動的に[`dangling`](dangling.md)を返すことができる。
22+
2223
## 例
2324
```cpp example
25+
#include <ranges>
26+
#include <vector>
27+
28+
using namespace std;
29+
30+
template<ranges::range R>
31+
ranges::borrowed_iterator_t<R> my_find(R&& r, const ranges::range_value_t<R>& v) {
32+
auto i = ranges::begin(r);
33+
auto e = ranges::end(r);
34+
while(i != e) {
35+
if(*i == v) return i;
36+
++i;
37+
}
38+
return e;
39+
}
40+
41+
vector<int> f(){ return {}; }
42+
43+
int main() {
44+
// borrowed_rangeではない範囲のrvalueが渡された場合、danglingが返る
45+
auto result1 = my_find(f(), 42);
46+
static_assert(same_as<decltype(result1), ranges::dangling>);
47+
48+
// lvalueが渡された場合、danglingにはならない
49+
auto vec = f();
50+
auto result2 = my_find(vec, 42);
51+
static_assert(same_as<decltype(result2), vector<int>::iterator>);
52+
53+
// borrowed_rangeのrvalueが渡された場合、danglingにはならない
54+
auto result3 = my_find(ranges::subrange{vec}, 42);
55+
static_assert(same_as<decltype(result3), vector<int>::iterator>);
56+
}
2457
```
25-
* std::ranges::range_difference_t[color ff0000]
58+
* ranges::ranges::borrowed_iterator_t[color ff0000]
59+
* ranges::range[link range.md]
60+
* ranges::begin[link begin.md]
61+
* ranges::end[link end.md]
62+
* ranges::range_value_t[link range_value_t.md]
63+
* ranges::dangling[link dangling.md]
64+
* ranges::subrange[link subrange.md.nolink]
65+
* borrowed_range[link borrowed_range.md]
66+
* same_as[link /reference/concepts/same_as.md]
2667

2768
### 出力
2869
```

reference/ranges/borrowed_subrange_t.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,47 @@ namespace std::ranges {
2020
2121
任意の範囲型`R`の部分範囲の型を取得する。ただし、`R`が[`borrowed_range`](borrowed_range.md)ではない場合、[`dangling`](dangling.md)になる。
2222
23+
2324
## 例
2425
```cpp example
26+
#include <ranges>
27+
#include <vector>
28+
29+
using namespace std;
30+
31+
template<ranges::range R>
32+
ranges::borrowed_subrange_t<R> my_all(R&& r) {
33+
auto i = ranges::begin(r);
34+
auto e = ranges::end(r);
35+
return {i, e};
36+
}
37+
38+
vector<int> f(){ return {}; }
39+
40+
int main() {
41+
// borrowed_rangeではない範囲のrvalueが渡された場合、danglingが返る
42+
auto result1 = my_all(f());
43+
static_assert(same_as<decltype(result1), ranges::dangling>);
44+
45+
// lvalueが渡された場合、danglingにはならない
46+
auto vec = f();
47+
auto result2 = my_all(vec);
48+
static_assert(!same_as<decltype(result2), ranges::dangling>);
49+
50+
// borrowed_rangeのrvalueが渡された場合、danglingにはならない
51+
auto result3 = my_all(ranges::subrange{vec});
52+
static_assert(!same_as<decltype(result3), ranges::dangling>);
53+
}
2554
```
26-
* std::ranges::# borrowed_subrange_t[color ff0000]
55+
* ranges::ranges::borrowed_iborrowed_subrange_tterator_t[color ff0000]
56+
* ranges::range[link range.md]
57+
* ranges::begin[link begin.md]
58+
* ranges::end[link end.md]
59+
* ranges::range_value_t[link range_value_t.md]
60+
* ranges::dangling[link dangling.md]
61+
* ranges::subrange[link subrange.md.nolink]
62+
* borrowed_range[link borrowed_range.md]
63+
* same_as[link /reference/concepts/same_as.md]
2764

2865
### 出力
2966
```

reference/ranges/dangling.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ int main()
5555
}
5656
```
5757
* ranges::dangling[color ff0000]
58-
* std::ranges::crend[link crend.md]
58+
* ranges::find[link /reference/algorithm/find.md]
59+
* ranges::subrange[link subrange.md.nolink]
60+
* borrowed_range[link borrowed_range.md]
61+
* same_as[link /reference/concepts/same_as.md]
5962
6063
### 出力
6164
```

0 commit comments

Comments
 (0)