Skip to content

Commit

Permalink
basic_const_iterator : * -> 追加 #1084
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Jul 28, 2023
1 parent fb63802 commit e19c878
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 2 deletions.
4 changes: 2 additions & 2 deletions reference/iterator/basic_const_iterator.md
Expand Up @@ -22,8 +22,8 @@ namespace std {
|------------------------------------------------------|-------------|-------|
| [`(constructor)`](basic_const_iterator/op_constructor.md) | コンストラクタ | C++23 |
| [`base`](basic_const_iterator/base.md) | 元のイテレータを取得する | C++23 |
| [`operator*`](basic_const_iterator/op_deref.md.nolink) | 間接参照演算子 | C++23 |
| [`operator->`](basic_const_iterator/op_arrow.md.nolink) | メンバアクセス演算子 | C++23 |
| [`operator*`](basic_const_iterator/op_deref.md) | 間接参照演算子 | C++23 |
| [`operator->`](basic_const_iterator/op_arrow.md) | メンバアクセス演算子 | C++23 |
| [`operator++`](basic_const_iterator/op_increment.md.nolink) | イテレータをインクリメントする | C++23 |
| [`operator--`](basic_const_iterator/op_decrement.md.nolink) | イテレータをデクリメントする | C++23 |
| [`operator+=`](basic_const_iterator/op_plus_assign.md.nolink) | イテレータ自身を進める | C++23 |
Expand Down
74 changes: 74 additions & 0 deletions reference/iterator/basic_const_iterator/op_arrow.md
@@ -0,0 +1,74 @@
# operator->
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
constexpr const auto* operator->() const
requires is_lvalue_reference_v<iter_reference_t<Iterator>> &&
same_as<remove_cvref_t<iter_reference_t<Iterator>>, value_type>;
```
* is_lvalue_reference_v[link /reference/type_traits/is_lvalue_reference.md]
* iter_reference_t[link /reference/iterator/iter_reference_t.md]
* same_as[link /reference/concepts/same_as.md]
* remove_cvref_t[link /reference/type_traits/remove_cvref.md]

## 概要

イテレータを通して参照先の要素のメンバにアクセスする

## 戻り値

ラップするイテレータを`current_`というメンバに保持するとして

- `Iterator`[`contiguous_iterator`](/reference/iterator/contiguous_iterator.md)のモデルとなる場合
- [`to_address`](/reference/memory/to_address.md)`((current_))`
- それ以外の場合
- [`addressof`](/reference/memory/addressof.md)`(*current_)`

##
```cpp example
#include <iostream>
#include <iterator>
#include <vector>

struct S {
int n;

void print() const {
std::cout << "call const : " << this->n << '\n';
}

void print() {
std::cout << "call non const : " << this->n << '\n';
}
};

int main() {
std::vector<S> vec = {S{1}, S{3}};

std::basic_const_iterator cit = vec.begin();

cit->print();
}
```
* cit->[color ff0000]
### 出力
```
call const : 1
```
## バージョン
### 言語
- C++20
### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 10.1
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 9
## 参照
- [P0896R4 The One Ranges Proposal (was Merging the Ranges TS)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0896r4.pdf)
59 changes: 59 additions & 0 deletions reference/iterator/basic_const_iterator/op_deref.md
@@ -0,0 +1,59 @@
# operator*
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
constexpr reference operator*() const;
```

## 概要
イテレータを間接参照する。

戻り値型`reference`は、[`iter_const_reference_t`](/reference/iterator/iter_const_reference_t.md)`<Iterator>`のエイリアス。

## 効果

ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価

`return static_cast<reference>(*current_);`

##
```cpp example
#include <iostream>
#include <iterator>
#include <vector>


int main() {
std::vector vec = {1, 2, 3, 4, 5};

std::basic_const_iterator cit = vec.begin();

std::cout << *cit << '\n';

// 要素を変更できない
//*cit = 0;
}
```
* *cit[color ff0000]

### 出力
```
1
```

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

Please sign in to comment.