diff --git a/reference/iterator/basic_const_iterator.md b/reference/iterator/basic_const_iterator.md index 07c9c7a44..61c588114 100644 --- a/reference/iterator/basic_const_iterator.md +++ b/reference/iterator/basic_const_iterator.md @@ -20,9 +20,8 @@ namespace std { | 名前 | 説明 | 対応バージョン | |------------------------------------------------------|-------------|-------| -| [`(constructor)`](basic_const_iterator/op_constructor.md.nolink) | コンストラクタ | C++23 | -| [`operator=`](basic_const_iterator/op_assign.md.nolink) | 代入演算子 | C++23 | -| [`base`](basic_const_iterator/base.md.nolink) | 元のイテレータを取得する | C++23 | +| [`(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_increment.md.nolink) | イテレータをインクリメントする | C++23 | @@ -64,7 +63,7 @@ namespace std { - それ以外の場合 - `input_iterator_tag` -## 非メンバ関数 +## 非メンバ(*Hidden friends*)関数 | 名前 | 説明 | 対応バージョン | |------------------------------------------------------|-------------|-------| @@ -75,11 +74,15 @@ namespace std { | [`operator+`](basic_const_iterator/op_plus.md.nolink) | イテレータを進める | C++23 | | [`operator-`](basic_const_iterator/op_minus.md.nolink) | 2つの`basic_const_iterator`の差を求める | C++23 | | [`iter_move`](basic_const_iterator/iter_move.md.nolink) | イテレータの要素の移動 | C++23 | + +## 非メンバ関数 + +| 名前 | 説明 | 対応バージョン | +|------------------------------------------------------|-------------|-------| | [`make_const_iterator`](make_const_iterator.md.nolink) | `basic_const_iterator`のヘルパ関数 | C++23 | | [`make_const_sentinel`](make_const_sentinel.md.nolink) | `basic_const_iterator`のヘルパ関数 | C++23 | ## 例 -(執筆中) ```cpp example #include @@ -101,6 +104,7 @@ int main() { //*cit = 0; } ``` + ### 出力 ``` 1 diff --git a/reference/iterator/basic_const_iterator/base.md b/reference/iterator/basic_const_iterator/base.md new file mode 100644 index 000000000..c8f53374a --- /dev/null +++ b/reference/iterator/basic_const_iterator/base.md @@ -0,0 +1,63 @@ +# base +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +constexpr const Iterator& base() const & noexcept; // (1) +constexpr Iterator base() &&; // (2) +``` + +## 概要 + +メンバ変数として保持している、元のイテレータを取得する。 + +## 戻り値 + +- (1) : 元のイテレータへの`const`参照を返す。 +- (2) : 元のイテレータをムーブして返す。 + +## 例 + +```cpp example +#include +#include +#include + +int main() { + std::vector vec = {1, 2, 3, 4, 5}; + + std::basic_const_iterator cit = vec.begin(); + + std::cout << *cit << '\n'; + std::cout << *(cit.base()) << '\n'; + + // 元のイテレータが可変イテレータならば要素を変更可能 + *(cit.base()) = 0; + std::cout << *(cit.base()) << '\n'; +} +``` +* base[color ff0000] + +### 出力 + +``` +1 +1 +0 +``` + +## バージョン +### 言語 +- 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) diff --git a/reference/iterator/basic_const_iterator/op_constructor.md b/reference/iterator/basic_const_iterator/op_constructor.md new file mode 100644 index 000000000..40b7ccc3d --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_constructor.md @@ -0,0 +1,88 @@ +# コンストラクタ +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +constexpr basic_const_iterator() requires default_initializable = default; // (1) + +constexpr basic_const_iterator(Iterator current); // (2) + +template U> +constexpr basic_const_iterator(basic_const_iterator current); // (3) + +template T> + requires convertible_to +constexpr basic_const_iterator(T&& current); // (4) +``` +* default_initializable[link /reference/concepts/default_initializable.md] +* convertible_to[link /reference/concepts/convertible_to.md] +* different-from[link /reference/ranges/different-from.md] + +## 概要 + +`basic_const_iterator`オブジェクトを構築する。 + +## 効果 + +ラップするイテレータを`current_`というメンバに保持するとして + +- (1) : `current_`をデフォルト構築する +- (2) : `current_`を`std::move(current)`で初期化する +- (3) : `current_`を`std::move(current.current_)`で初期化する +- (4) : `current_`を`std::forward(current)`で初期化する + +## 例 +```cpp example +#include +#include + +// 例示のための単純なイテレータラッパ、ラップするイテレータへの暗黙変換を提供する +template +struct wrap_iter { + I it; + + operator I() const { + return it; + } +}; + +int main() { + using I = std::vector::iterator; + + std::vector vec = {1, 2, 3, 4, 5}; + + // (1) デフォルトコンストラクタ + std::basic_const_iterator ci1{}; + + // (2) イテレータから構築 + std::basic_const_iterator ci2{vec.begin()}; + + // (3) 別のbasic_const_iteratorから変換して構築(コピーコンストラクタ) + std::basic_const_iterator ci3{ci2}; + + wrap_iter wrap{ci2}; + // (4) Iteratorに変換可能な型から構築 + std::basic_const_iterator ci4{wrap}; +} +``` +* basic_const_iterator[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) diff --git a/reference/iterator/counted_iterator/base.md b/reference/iterator/counted_iterator/base.md index b70286fa7..f66dcb947 100644 --- a/reference/iterator/counted_iterator/base.md +++ b/reference/iterator/counted_iterator/base.md @@ -39,7 +39,7 @@ int main() { std::cout << *(ci.base()); } ``` -* count[color ff0000] +* base[color ff0000] * ranges::begin[link /reference/ranges/begin.md] ### 出力