- iterator[meta header]
- std[meta namespace]
- variable[meta id-type]
- cpp20[meta cpp]
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;
// move_iteratorに対する特殊化 (C++23)
template<class Iterator1, class Iterator2>
requires (!sized_sentinel_for<Iterator1, Iterator2>)
inline constexpr bool disable_sized_sentinel_for<move_iterator<Iterator1>,
move_iterator<Iterator2>> = true;
}- move_iterator[link move_iterator.md]
- sized_sentinel_for[link /reference/iterator/sized_sentinel_for.md]
- reverse_iterator[link /reference/iterator/reverse_iterator.md]
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 [mark verified]
- Visual C++: 2019 Update 6 [mark verified]
- 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
- LWG Issue 3736.
move_iteratormissingdisable_sized_sentinel_forspecialization- C++23で、
move_iteratorに対するdisable_sized_sentinel_forの特殊化が追加され、move_iteratorが意味論的にsized_sentinel_forを満たさない場合に誤ってそれを満たすと判定される問題が解消された
- C++23で、