Skip to content

Commit

Permalink
範囲アクセス関数のP2278R4対応 #1084
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Aug 25, 2023
1 parent 4e3f803 commit e37ef9b
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 15 deletions.
18 changes: 14 additions & 4 deletions reference/ranges/cdata.md
Expand Up @@ -16,10 +16,19 @@ namespace std::ranges {
Rangeの要素が格納されたメモリ領域へのポインタを取得する関数オブジェクト。
## 効果
部分式`E`の型を`T`とする。このとき、式`ranges::cdata(E)`の効果は以下の式と等しい。
部分式`E`の型を`T`、`E`の評価結果オブジェクトを示す左辺値を`t`とする。このとき、式`ranges::cdata(E)`の効果は以下の式と等しい。
1. `E`がlvalueであれば、[`ranges::data`](data.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::data`](data.md)`(static_cast<const T&&>(E))`
- C++20まで
1. `E`がlvalueであれば、[`ranges::data`](data.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::data`](data.md)`(static_cast<const T&&>(E))`
- C++23から
1. `E`が右辺値であり、[`enable_borrowed_range`](./enable_borrowed_range.md)`<remove_cv_t<T>>`が`false`となる場合、`ranges::cdata(E)`は不適格
2. それ以外の場合、`as-const-pointer(`[`ranges::data`](data.md)`(`[`possibly-const-range`](./possibly-const-range.md)`(t)))`
- `as-const-pointer`は次のような説明専用関数テンプレートである
```cpp
template<class T>
constexpr auto as-const-pointer(const T* p) { return p; }
```

## 戻り値
Rangeの要素が格納されたメモリ領域へのポインタ。
Expand All @@ -28,7 +37,7 @@ Rangeの要素が格納されたメモリ領域へのポインタ。
Rangeが`const`な場合について[`ranges::data`](data.md)をカスタマイズすることで、`ranges::cdata`をカスタマイズできる。

## 備考
`ranges::cdata(E)`が有効な式であるとき、その型はオブジェクトへのポインタである。
`ranges::cdata(E)`が有効な式であるとき、その型はオブジェクトへのポインタである(C++23以降、このポインタは定数ポインタである)

##
```cpp example
Expand Down Expand Up @@ -71,3 +80,4 @@ array size:1 at 0x556ec23ba2b0
## 参照
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
- [C++20 ranges](https://techbookfest.org/product/5134506308665344)
- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
13 changes: 9 additions & 4 deletions reference/ranges/cend.md
Expand Up @@ -16,10 +16,14 @@ namespace std::ranges {
Rangeから、最後尾要素の次を指す読み取り専用イテレータもしくは番兵を取得する関数オブジェクト。
## 効果
部分式`E`の型を`T`とする。このとき、式`ranges::cend(E)`の効果は以下の式と等しい。
部分式`E`の型を`T`、`E`の評価結果オブジェクトを示す左辺値を`t`とする。このとき、式`ranges::cend(E)`の効果は以下の式と等しい。
1. `E`がlvalueであれば、[`ranges::end`](end.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::end`](end.md)`(static_cast<const T&&>(E))`
- C++20まで
1. `E`がlvalueであれば、[`ranges::end`](end.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::end`](end.md)`(static_cast<const T&&>(E))`
- C++23から
1. `E`が右辺値であり、[`enable_borrowed_range`](./enable_borrowed_range.md)`<remove_cv_t<T>>`が`false`となる場合、`ranges::cend(E)`は不適格
2. それ以外の場合、式`U`を[`ranges::end`](end.md)`(`[`possibly-const-range`](./possibly-const-range.md)`(t))`とすると、[`const_sentinel`](/reference/iterator/const_sentinel.md)`<decltype(U)>(U)`
## 戻り値
最後尾要素の次を指す読み取り専用イテレータもしくは番兵。
Expand All @@ -28,7 +32,7 @@ Rangeから、最後尾要素の次を指す読み取り専用イテレータも
Rangeが`const`な場合について[`ranges::end`](end.md)をカスタマイズすることで、`ranges::cend`をカスタマイズできる。
## 備考
`ranges::cend(E)`が有効な式であるとき、`ranges::cend(E)`の型`S`、[`ranges::cbegin`](cbegin.md)`(E)`の型`I`は[`sentinel_for`](/reference/iterator/sentinel_for.md)`<S, I>`のモデルである。
`ranges::cend(E)`が有効な式であるとき、`ranges::cend(E)`の型`S`、[`ranges::cbegin`](cbegin.md)`(E)`の型`I`は[`sentinel_for`](/reference/iterator/sentinel_for.md)`<S, I>`のモデルである。C++23以降はさらに、`S`が`input_iterator`のモデルならば`S`は[`constant-iterator`](/reference/iterator/constant-iterator.md)のモデルである。
## 例
```cpp example
Expand Down Expand Up @@ -75,3 +79,4 @@ int main()
## 参照
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
- [C++20 ranges](https://techbookfest.org/product/5134506308665344)
- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
14 changes: 11 additions & 3 deletions reference/ranges/crbegin.md
Expand Up @@ -16,17 +16,24 @@ namespace std::ranges {
Rangeの末尾を指す読み取り専用逆イテレータを取得する関数オブジェクト。
## 効果
部分式`E`の型を`T`とする。このとき、式`ranges::crbegin(E)`の効果は以下の式と等しい。
部分式`E`の型を`T`、`E`の評価結果オブジェクトを示す左辺値を`t`とする。このとき、式`ranges::crbegin(E)`の効果は以下の式と等しい。
1. `E`がlvalueであれば、[`ranges::rbegin`](rbegin.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::rbegin`](rbegin.md)`(static_cast<const T&&>(E))`
- C++20まで
1. `E`がlvalueであれば、[`ranges::rbegin`](rbegin.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::rbegin`](rbegin.md)`(static_cast<const T&&>(E))`
- C++23から
1. `E`が右辺値であり、[`enable_borrowed_range`](./enable_borrowed_range.md)`<remove_cv_t<T>>`が`false`となる場合、`ranges::crbegin(E)`は不適格
2. それ以外の場合、式`U`を[`ranges::rbegin`](rbegin.md)`(`[`possibly-const-range`](./possibly-const-range.md)`(t))`とすると、[`const_iterator`](/reference/iterator/const_iterator.md)`<decltype(U)>(U)`
## 戻り値
Rangeの末尾を指す読み取り専用逆イテレータ。
## カスタマイゼーションポイント
Rangeが`const`な場合について[`ranges::rbegin`](rbegin.md)をカスタマイズすることで、`ranges::crbegin`をカスタマイズできる。
## 備考
`ranges::crbegin`の呼び出しが有効な式であるとき、その型は[`input_or_output_iterator`](/reference/iterator/input_or_output_iterator.md)のモデルであり、C++23以降はさらに[`constant-iterator`](/reference/iterator/constant-iterator.md)のモデルである。
## 例
```cpp example
#include <iostream>
Expand Down Expand Up @@ -101,3 +108,4 @@ int main()
## 参照
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
- [C++20 ranges](https://techbookfest.org/product/5134506308665344)
- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
13 changes: 9 additions & 4 deletions reference/ranges/crend.md
Expand Up @@ -16,10 +16,14 @@ namespace std::ranges {
Rangeの先頭の前を指す、読み取り専用逆イテレータもしくは番兵を取得する関数オブジェクト。
## 効果
部分式`E`の型を`T`とする。このとき、式`ranges::crend(E)`の効果は以下の式と等しい。
部分式`E`の型を`T`、`E`の評価結果オブジェクトを示す左辺値を`t`とする。このとき、式`ranges::crend(E)`の効果は以下の式と等しい。
1. `E`がlvalueであれば、[`ranges::rend`](rend.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::rend`](rend.md)`(static_cast<const T&&>(E))`
- C++20まで
1. `E`がlvalueであれば、[`ranges::rend`](rend.md)`(static_cast<const T&>(E))`
2. それ以外の場合、[`ranges::rend`](rend.md)`(static_cast<const T&&>(E))`
- C++23から
1. `E`が右辺値であり、[`enable_borrowed_range`](./enable_borrowed_range.md)`<remove_cv_t<T>>`が`false`となる場合、`ranges::crend(E)`は不適格
2. それ以外の場合、式`U`を[`ranges::rend`](rend.md)`(`[`possibly-const-range`](./possibly-const-range.md)`(t))`とすると、[`const_sentinel`](/reference/iterator/const_sentinel.md)`<decltype(U)>(U)`
## 戻り値
Rangeの先頭の前を指す、読み取り専用逆イテレータもしくは番兵。
Expand All @@ -28,7 +32,7 @@ Rangeの先頭の前を指す、読み取り専用逆イテレータもしくは
Rangeが`const`な場合について[`ranges::rend`](rend.md)をカスタマイズすることで、`ranges::crend`をカスタマイズできる。
## 備考
`ranges::crend(E)`が有効な式であるとき、`ranges::crend(E)`の型`S`、[`ranges::crbegin`](crbegin.md)`(E)`の型`I`は[`sentinel_for`](/reference/iterator/sentinel_for.md)`<S, I>`のモデルである。
`ranges::crend(E)`が有効な式であるとき、`ranges::crend(E)`の型`S`、[`ranges::crbegin`](crbegin.md)`(E)`の型`I`は[`sentinel_for`](/reference/iterator/sentinel_for.md)`<S, I>`のモデルである。C++23以降はさらに、`S`が`input_iterator`のモデルならば`S`は[`constant-iterator`](/reference/iterator/constant-iterator.md)のモデルである。
## 例
```cpp example
Expand Down Expand Up @@ -104,3 +108,4 @@ int main()
## 参照
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
- [C++20 ranges](https://techbookfest.org/product/5134506308665344)
- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)

0 comments on commit e37ef9b

Please sign in to comment.