Skip to content

Commit

Permalink
range_const_reference_t追加 #1084
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Aug 25, 2023
1 parent 99a88c1 commit 4e3f803
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 5 deletions.
6 changes: 3 additions & 3 deletions reference/iterator/iter_const_reference_t.md
Expand Up @@ -21,9 +21,9 @@ namespace std {
## 型の決定
`iter_value_t<It>`が非参照型であり`iter_reference_t<It>`から修飾を除いた型であるとすると、`iter_reference_t<It>`に対して`iter_const_reference_t<It>`は基本的には次のようになる
`iter_value_t<It>`が非参照型であり`iter_reference_t<It>`から修飾を除いた型であるとすると、`iter_reference_t<It>`に対して`iter_const_reference_t<It>`は基本的には次のようになる(`T`を任意の修飾なしの型とする)
|`iter_reference_t`|`iter_const_reference_t<It>`|
|`iter_reference_t<It>`|`iter_const_reference_t<It>`|
|---|---|
|`T&`|`const T&`|
|`T&&`|`const T&&`|
Expand All @@ -32,7 +32,7 @@ namespace std {
|`T`|`T`|
|`const T`|`T`|
`It`に対して`iterator_traits`の特殊化が存在する場合や、`const iter_value_t<It>&&`と`iter_reference_t<It>`について`common_reference`が特殊化されている場合はこれと異なる結果となりうる。標準ライブラリにあるそのようなイテレータ型を持つものについて一部例を示すと、次のようになる
`iter_value_t<It>`に対して`iter_reference_t<It>`が修飾以外も異なる型となる場合や、`It`に対して`iterator_traits`の特殊化が存在する場合、`const iter_value_t<It>&&`と`iter_reference_t<It>`について`common_reference`が特殊化されている場合などはこれと異なる結果となりうる。標準ライブラリにあるそのようなイテレータ型を持つものについて一部例を示すと、次のようになる
|`It`の取得元の範囲|`iter_value_t<It>`|`iter_reference_t<It>`|`iter_const_reference_t<It>`|
|---|---|---|---|
Expand Down
4 changes: 2 additions & 2 deletions reference/ranges.md
Expand Up @@ -66,12 +66,12 @@ C++20では関数によるカスタマイゼーションポイントの問題点
| [`iterator_t`](ranges/iterator_t.md) | イテレータ型を取得する (alias template) | C++20 |
| [`sentinel_t`](ranges/sentinel_t.md) | 番兵型を取得する (alias template) | C++20 |
| [`const_iterator_t`](ranges/const_iterator_t.md) | 定数イテレータ型を取得する (alias template) | C++23 |
| [`const_sentinel_t`](ranges/const_sentinel_t.md) | 定数番兵型を取得する (alias template) | C++23 |
| [`const_sentinel_t`](ranges/const_sentinel_t.md) | 定数番兵型を取得する (alias template) | C++23 |
| [`range_difference_t`](ranges/range_difference_t.md) | イテレータの差の型を取得する (alias template) | C++20 |
| [`range_size_t`](ranges/range_size_t.md) | サイズの型を取得する(alias template) | C++20 |
| [`range_value_t`](ranges/range_value_t.md) | 要素の型を取得する (alias template) | C++20 |
| [`range_reference_t`](ranges/range_reference_t.md) | 要素の参照型を取得する (alias template) | C++20 |
| [`range_const_reference_t`](ranges/range_const_reference_t.md.nolink)| 要素の定数参照型を取得する (alias template) | C++23 |
| [`range_const_reference_t`](ranges/range_const_reference_t.md) | 要素の定数参照型を取得する (alias template) | C++23 |
| [`range_rvalue_reference_t`](ranges/range_rvalue_reference_t.md) | 要素の右辺値参照型を取得する (alias template) | C++20 |
## Rangeコンセプト
Expand Down
49 changes: 49 additions & 0 deletions reference/ranges/range_const_reference_t.md
@@ -0,0 +1,49 @@
# range_const_reference_t
* ranges[meta header]
* std::ranges[meta namespace]
* type-alias[meta id-type]
* cpp23[meta cpp]

```cpp
namespace std::ranges {
template<range R>
using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;
}
```
* range[link range.md]
* iter_const_reference_t[link /reference/iterator/iter_const_reference_t.md]
* iterator_t[link iterator_t.md]
## 概要
任意のRange型`R`から、そのRangeの要素への`const`参照型を取得する。
## 例
```cpp example
#include <ranges>
#include <vector>
int main() {
static_assert(std::same_as<std::ranges::range_const_reference_t<std::vector<int>> , const int&>);
static_assert(std::same_as<std::ranges::range_const_reference_t<std::vector<bool>>, bool>);
}
```
* std::ranges::range_const_reference_t[color ff0000]

### 出力
```
```

## バージョン
### 言語
- C++23

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 13.1
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6

## 参照

- [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 4e3f803

Please sign in to comment.