diff --git a/reference/iterator.md b/reference/iterator.md index a2e1dbc8c..f2111fdad 100644 --- a/reference/iterator.md +++ b/reference/iterator.md @@ -78,7 +78,7 @@ C++20以降の標準ライブラリでは、任意のイテレータに対して | [`iter_reference_t`](iterator/iter_reference_t.md) | イテレータの`reference_type`を取得する (alias template) | C++20 | | [`iter_rvalue_reference_t`](iterator/iter_rvalue_reference_t.md) | イテレータの指す要素の右辺値参照型を取得する (alias template) | C++20 | | [`iter_common_reference_t`](iterator/iter_common_reference_t.md) | イテレータの`value_type`と`reference_type`の[`common_reference`](/reference/type_traits/common_reference.md)を取得する (alias template) | C++20 | -| [`iter_const_reference_t`](iterator/iter_const_reference_t.md.nolink) | イテレータの参照型(`iter_reference_t`)を`const`化したものを取得する (alias template) | C++23 | +| [`iter_const_reference_t`](iterator/iter_const_reference_t.md) | イテレータの参照型(`iter_reference_t`)を`const`化したものを取得する (alias template) | C++23 | | [`indirect_result_t`](iterator/indirect_result_t.md) | 関数呼び出し可能な型`F`を複数のイテレータ`Is...`によって呼び出した時の戻り値型を取得する (alias template) | C++20 | | [`projected`](iterator/projected.md) | イテレータ`I`の`Proj`による射影操作の結果を表すことのできる[`indirectly_readable`](/reference/iterator/indirectly_readable.md)なクラス (class template) | C++20 | | [`incrementable_traits`](iterator/incrementable_traits.md) | `iter_difference_t`にアダプトするためのカスタマイゼーションポイント (class template) | C++20 | diff --git a/reference/iterator/iter_const_reference_t.md b/reference/iterator/iter_const_reference_t.md new file mode 100644 index 000000000..27b0db857 --- /dev/null +++ b/reference/iterator/iter_const_reference_t.md @@ -0,0 +1,91 @@ +# iter_const_reference_t +* iterator[meta header] +* std[meta namespace] +* type-alias[meta id-type] +* cpp20[meta cpp] + +```cpp +namespace std { + template + using iter_const_reference_t = common_reference_t&&, iter_reference_t>; +} +``` +* indirectly_readable[link ./indirectly_readable.md] +* common_reference_t[link /reference/type_traits/common_reference.md] +* iter_value_t[link ./iter_value_t.md] +* iter_reference_t[link ./iter_reference_t.md] + +## 概要 + +任意のイテレータ型`It`から、そのイテレータの要素への`const`参照型を取得する。 + +## 型の決定 + +`iter_value_t`が非参照型であり`iter_reference_t`から修飾を除いた型であるとすると、`iter_reference_t`に対して`iter_const_reference_t`は基本的には次のようになる + +|`iter_reference_t`|`iter_const_reference_t`| +|---|---| +|`T&`|`const T&`| +|`T&&`|`const T&&`| +|`const T&`|`const T&`| +|`const T&&`|`const T&&`| +|`T`|`T`| +|`const T`|`T`| + +`It`に対して`iterator_traits`の特殊化が存在する場合や、`const iter_value_t&&`と`iter_reference_t`について`common_reference`が特殊化されている場合はこれと異なる結果となりうる。標準ライブラリにあるそのようなイテレータ型を持つものについて一部例を示すと、次のようになる + +|`It`の取得元の範囲|`iter_value_t`|`iter_reference_t`|`iter_const_reference_t`| +|---|---|---|---| +|[`std::vector`](/reference/vector/vector.md)|`bool`|`std::vector::reference`|`bool`| +|`const std::vector`|`bool`|`bool`|`bool`| +|[`views::zip`](/reference/ranges/zip_view.md.nolink)|`std::tuple`|`std::tuple`|`std::tuple`| +|[`views::enumrate`](/reference/ranges/enumrate_view.md.nolink)|`std::tuple`|`std::tuple`|`std::tuple`| + +表中の`T, U`はそれそれの`view`に入力された範囲の値型、`D`は`views::enumrate`の入力範囲の`iter_difference_t`とする。 + +## 例 +```cpp example +#include +#include + +// indirectly_readableとなる最低限の型 +// Rが参照型、Vが値型となる +template +struct test_indirectly_readable { + using value_type = V; + using difference = std::ptrdiff_t; + + auto operator*() const -> R; +}; + +int main() { + static_assert(std::same_as>, const int&>); + static_assert(std::same_as>, const int&&>); + static_assert(std::same_as>, const int&>); + static_assert(std::same_as>, const int&&>); + static_assert(std::same_as>, int>); + static_assert(std::same_as>, int>); + + static_assert(std::same_as , std::tuple>>, std::tuple>); + static_assert(std::same_as, std::tuple>>, std::tuple>); + static_assert(std::same_as& , std::tuple>>, const std::tuple&>); +} +``` +* std::iter_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)