最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

variable
<iterator>

# std::disable_sized_sentinel_for(C++20)

    namespace std {
      template<class S, class I>
      inline constexpr bool disable_sized_sentinel_for = false;

      // reverse_iteratorに対する特殊化
      template<class Iterator1, class Iterator2>
        requires (!sized_sentinel_for<Iterator1, Iterator2>)
      inline constexpr bool disable_sized_sentinel_for<reverse_iterator<Iterator1>,
                                                       reverse_iterator<Iterator2>> = true;
    }

## 概要

`disable_sized_sentinel_for`は、任意のイテレータ型`I`とその番兵型`S`について`sized_sentinel_for`を無効化するカスタマイゼーションポイントである。

イテレータ型`I, S`が`sized_sentinel_for`を満たすがそのモデルとならない（意味論的な要件まで満足することができない）ようなイテレータをライブラリで使用するためのopt-outメカニズムとして提供されている。

## 要件

`I, S`がプログラム定義型である場合に、非配列型かつオブジェクト型である`I, S`に対して特殊化が許可される。
そのような特殊化は定数式で使用可能であり、`const bool`型を持つ必要がある。

## 例

`sized_sentinel_for`のサンプルコードを参照。

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 6 ✅

## 関連項目

- C++20 コンセプト

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- P1871R0 Should concepts be enabled or disabled?
- P1871R1 Concept traits should be named after concepts
- microsoft/STL P1871R1 disable_sized_sentinel_for #607 - Github