Skip to content

Commit

Permalink
views::as_const追加 #1084
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Sep 6, 2023
1 parent c5d0375 commit 953efe6
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 2 deletions.
4 changes: 2 additions & 2 deletions reference/ranges.md
Expand Up @@ -321,8 +321,8 @@ range | adaptor(args...)
| 名前 | 説明 | 対応バージョン |
|-----------------------------------------------|--------------------------------------------------------------|----------------|
| [`as_const_view`](ranges/as_const_view.md.nolink) | 各要素をconstにするビュー (class template) | C++23 |
| [`views::as_const`](ranges/as_const.md.nolink) | `as_const_view`を生成する (customization point object) | C++23 |
| [`as_const_view`](ranges/as_const_view.md) | 各要素をconstにするビュー (class template) | C++23 |
| [`views::as_const`](ranges/as_const_view.md) | `as_const_view`を生成する (customization point object) | C++23 |
### elements view
Expand Down
106 changes: 106 additions & 0 deletions reference/ranges/as_const_view.md
@@ -0,0 +1,106 @@
# as_const_view
* ranges[meta header]
* std::ranges[meta namespace]
* class template[meta id-type]
* cpp23[meta cpp]

```cpp
namespace std::ranges {
template<view V>
requires input_range<V>
class as_const_view : public view_interface<as_const_view<V>> { …… }; // (1)

namespace views {
inline constexpr /*unspecified*/ as_const = /*unspecified*/; // (2)
}
}
```
* input_range[link input_range.md]
* view[link view.md]
* view_interface[link view_interface.md]
## 概要
- (1): 各要素を定数化したRangeとして振る舞う[`view`](view.md)
- (2): `as_const_view`を生成するRangeアダプタオブジェクト
### Rangeコンセプト
| borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
| (1) | (1) | | ○ | (1) | (1) | (1) | (1) | (1) | ○ | ○ |
- (1): `V`に従う
## 効果
- (2): 式`views::as_const(E)`の効果は次のいずれか(`T = decltype((E))`、`U = remove_cvref_t<T>`とする)
- `views::all_t<T>`が`constant_range`のモデルとなる場合 : `views::all(E)`
- 任意の型`X`に対して、`U`が`empty_view<X>`である場合 : `auto(views::empty<const X>)`
- 任意の型`X`と整数値`Extent`に対して、`U`が`span<X, Extent>`である場合 : `span<const X, Extent>(E)`
- 任意の型`X`に対して、`U`が`ref_view<X>`であり、`const X`が`constant_range`のモデルとなる場合 : `ref_view(static_cast<const X&>(E.base()))`
- `E`が左辺値であり、`const U`が`constant_range`のモデルとなり、かつ`U`は`view`のモデルとならない場合 : `ref_view(static_cast<const U&>(E))`
- それ以外の場合 : `as_const_view(E)`
## メンバ関数
| 名前 | 説明 | 対応バージョン |
|--------------------------------------------------|----------------------------------|----------------|
| [`(constructor)`](as_const_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
| [`base`](as_const_view/base.md.nolink) | `V`の参照を取得する | C++23 |
| [`begin`](as_const_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
| [`end`](as_const_view/end.md.nolink) | 番兵を取得する | C++23 |
| [`size`](as_const_view/size.md.nolink) | 要素数を取得する | C++23 |
## 継承しているメンバ関数
| 名前 | 説明 | 対応バージョン |
|----------------------------------------------|----------------------------------|----------------|
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
## 推論補助
| 名前 | 説明 | 対応バージョン |
|-------------------------------------------------------|------------------------------|----------------|
| [`(deduction_guide)`](as_const_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
## 例
```cpp example
#include <ranges>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
for (const int& i : vec | std::views::as_const) {
std::cout << i << ' ';
// 変更不可
//*i = 0
}
}
```
* views::as_const[color ff0000]

### 出力
```
1 2 3 4
```

## バージョン
### 言語
- 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 953efe6

Please sign in to comment.