最終更新日時: 2026年02月08日 18時00分28秒 (JST)
yoh が更新

履歴 編集

function
<ranges>

# std::ranges::possibly-const-range(C++23)

    namespace std::ranges {
      template<input_range R>
      constexpr auto& possibly-const-range(R& r) noexcept {
        if constexpr (constant_range<const R> && !constant_range<R>) {
          return const_cast<const R&>(r);
        } else {
          return r;
        }
      }
    }

## 概要

`possibly-const-range`は入力の`input_range`オブジェクト`r`を、可能なら要素が定数化された`range`へ変換するものである。

主に、`ranges::cbegin()`など定数イテレータを取得したい場所で、イテレータ取得前の段階で`range`型の簡単な変換のみで定数イテレータを取得できるかを試行するのに使用される。

## バージョン

### 言語

- C++23

## 参照

- P2278R4 `cbegin` should always return a constant iterator
- LWG Issue 3948. `possibly-const-range` and `as-const-pointer` should be `noexcept`