Namespaces
Variants

std::ranges:: sized_range, std::ranges:: disable_sized_range

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
(1)
template < class T >

concept sized_range = ranges:: range < T > &&
requires ( T & t ) {
ranges:: size ( t ) ;

} ;
(C++20以降)
(C++26まで)
template < class T >

concept sized_range = ranges :: approximately_sized_range < T > &&
requires ( T & t ) {
ranges:: size ( t ) ;

} ;
(C++26以降)
template < class >
constexpr bool disable_sized_range = false ;
(2) (C++20以降)
1) sized_range コンセプトは、 range (C++26まで) approximately_sized_range (C++26以降) 型の要件を定め、その型が size 関数を用いて定数時間でサイズを取得できることを指定します。
2) disable_sized_range は、 size 関数(メンバー関数または非メンバー関数)を提供するが、実際には sized_range をモデルとしない範囲型の使用を可能にするために存在します。ユーザーはcv修飾されていないプログラム定義型に対して disable_sized_range の特殊化を定義できます。そのような特殊化は 定数式 で使用可能であり、型が const bool でなければなりません。

目次

セマンティック要件

1) std:: remove_reference_t < T > の左辺値 t が与えられたとき、 T sized_range をモデル化するのは、以下の条件が満たされる場合に限る:
  • ranges:: iterator_t < T > forward_iterator をモデル化する場合、 ranges:: size ( t ) ranges:: begin ( t ) の評価に関係なく well-defined であること(すなわち、シングルパスのサイズ指定範囲は最初の begin 呼び出し前のみ size の呼び出しをサポートしてもよいが、フォワード範囲は常に size をサポートしなければならない)。

注記

disable_sized_range は、イテレータと番兵が sized_sentinel_for を満たす範囲のオプトアウトには使用できません。 std::disable_sized_sentinel_for を代わりに使用する必要があります。

disable_sized_range は配列型または参照型に対して特殊化できません。

機能テスト マクロ 標準 機能
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range および ranges::reserve_hint

#include <forward_list>
#include <list>
#include <ranges>
static_assert
(
    std::ranges::sized_range<std::list<int>> and
    not std::ranges::sized_range<std::forward_list<int>>
);
int main() {}

関連項目

イテレータ型が random_access_iterator を満たす範囲を指定する
(コンセプト)
イテレータ型が contiguous_iterator を満たす範囲を指定する
(コンセプト)