diff --git a/reference/ranges.md b/reference/ranges.md index adda7dbb9..e61744fe2 100644 --- a/reference/ranges.md +++ b/reference/ranges.md @@ -90,7 +90,7 @@ C++20では関数によるカスタマイゼーションポイントの問題点 | [`contiguous_range`](ranges/contiguous_range.md) | イテレータが隣接イテレータであるRange (concept) | C++20 | | [`common_range`](ranges/common_range.md) | イテレータと番兵の型が等しいRange (concept) | C++20 | | [`viewable_range`](ranges/viewable_range.md) | ビューに変換できるRange (concept) | C++20 | -| [`constant_range`](ranges/constant_range.md.nolink) | 要素が定数なRange (concept) | C++23 | +| [`constant_range`](ranges/constant_range.md) | 要素が定数なRange (concept) | C++23 | ## カスタマイゼーションポイント diff --git a/reference/ranges/constant_range.md b/reference/ranges/constant_range.md new file mode 100644 index 000000000..4843aa153 --- /dev/null +++ b/reference/ranges/constant_range.md @@ -0,0 +1,51 @@ +# constant_range +* ranges[meta header] +* concept[meta id-type] +* std::ranges[meta namespace] +* cpp23[meta cpp] + +```cpp +namespace std::ranges { + template + concept constant_range = input_range && constant-iterator>; +} +``` +* input_range[link input_range.md] +* constant-iterator[link /reference/iterator/constant-iterator.md] +* iterator_t[link iterator_t.md] + +## 概要 + +`constant_range`は、その要素が変更不可能な`range`を表すコンセプトである。 + +## 例 + +```cpp example +#include +#include + +int main() { + static_assert(not std::ranges::constant_range< std::vector>); + static_assert( std::ranges::constant_range>); + + static_assert(std::ranges::constant_range>); +} +``` + +### 出力 + +``` +``` + +## バージョン +### 言語 +- 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/ranges/possibly-const-range.md b/reference/ranges/possibly-const-range.md new file mode 100644 index 000000000..8a921c7fd --- /dev/null +++ b/reference/ranges/possibly-const-range.md @@ -0,0 +1,35 @@ +# possibly-const-range +* ranges[meta header] +* std::ranges[meta namespace] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +namespace std::ranges { + template + constexpr auto& possibly-const-range(R& r) { + if constexpr (constant_range && !constant_range) { + return const_cast(r); + } else { + return r; + } + } +} +``` +* input_range[link /reference/ranges/input_range.md] +* constant_range[link /reference/ranges/constant_range.md] + +## 概要 + +`possibly-const-range`は入力の`input_range`オブジェクト`r`を、可能なら要素が定数化された`range`へ変換するものである。 + +主に、`ranges::cbegin()`など定数イテレータを取得したい場所で、イテレータ取得前の段階で`range`型の簡単な変換のみで定数イテレータを取得できるかを試行するのに使用される。 + + +## バージョン +### 言語 +- C++23 + +## 参照 + +- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)