namespace std::ranges {
template<class T>
concept common_range = range<T> && same_as<iterator_t<T>, sentinel_t<T>>;
}
概要
common_range
は、イテレータと番兵の型が等しいRangeを表すコンセプトである。
標準のコンテナはすべてcommon_range
のモデルである。
モデル
型T
がcommon_range
のモデルとなるのは、T
がrange
のモデルであり、T
から取得した番兵とイテレータの型が等しい場合である。
例
#include <ranges>
int main() {
namespace ranges = std::ranges;
namespace views = std::views;
// 無限長のiotaはcommon_rangeではない
// (イテレータと番兵の型が異なる)
static_assert(!ranges::common_range<decltype(views::iota(0))>);
// commonを適用するとcommon_rangeになる
static_assert(ranges::common_range<decltype(views::iota(0) | views::common)>);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ??
- Visual C++: 2019 Update 10 ✅
関連項目
- C++17 範囲 for ループの制限緩和
範囲for文は、C++17の時点で先行してcommon_range
ではない範囲を扱えるようになっている views::common
任意の範囲をcommon_range
に変換するRangeアダプタオブジェクト