std::ranges:: size
|
ヘッダーで定義
<ranges>
|
||
|
ヘッダーで定義
<iterator>
|
||
|
inline
namespace
/* unspecified */
{
inline
constexpr
auto
size
=
/* unspecified */
;
|
(C++20以降)
(カスタマイゼーションポイントオブジェクト) |
|
|
呼び出しシグネチャ
|
||
|
template
<
class
T
>
requires
/* see below */
|
(C++20以降) | |
t 内の要素数を定数時間で計算します。
与えられた
部分式
において、
t
が(
実体化された
可能性もある)結果オブジェクトを表し、
E
がその式を表し、
E
の型が
T
である場合:
-
Tが未知の境界を持つ配列である場合、 ranges :: size ( E ) は不適格な形式です。 -
そうでなければ、
Tが配列型の場合、 ranges :: size ( E ) は 式等価 である decay-copy ( std:: extent_v < T > ) (C++23まで) auto ( std:: extent_v < T > ) (C++23から) に。 -
そうでなければ、以下のすべての条件が満たされる場合、
ranges
::
size
(
E
)
は式等価である:
decay-copy
(
t.
size
(
)
)
(C++23未満)
auto
(
t.
size
(
)
)
(C++23以上)
:
- ranges:: disable_sized_range < std:: remove_cv_t < T >> が false である。
- decay-copy ( t. size ( ) ) (C++23未満) auto ( t. size ( ) ) (C++23以上) が integer-like型 の有効な式である。
-
それ以外の場合、以下のすべての条件が満たされるならば、
ranges
::
size
(
E
)
は式等価である:
decay-copy
(
size
(
t
)
)
(C++23未満)
auto
(
size
(
t
)
)
(C++23以上)
:
-
Tはクラス型または列挙型である。 - ranges:: disable_sized_range < std:: remove_cv_t < T >> が false である。
-
decay-copy
(
size
(
t
)
)
(C++23未満)
auto
(
size
(
t
)
)
(C++23以上)
が整数様型の有効な式であり、ここで
sizeの意味は 実引数依存の名前探索 のみを実行することによって確立される。
-
-
それ以外の場合、以下のすべての条件が満たされるならば、
ranges
::
size
(
E
)
は式等価で
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) となります:-
Tはforward_rangeをモデル化する。 -
ranges::
begin
(
t
)
の型を
Iとし、 ranges:: end ( t ) の型をSとしたとき、両方のsized_sentinel_for< S, I > とforward_iterator< I > がモデル化される。 -
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) は有効な式である。
-
- それ以外の場合、 ranges :: size ( E ) は不適格です。
上記の診断可能な不適格なケースは、テンプレートのインスタンス化の直接のコンテキスト内で substitution failure が発生した場合に ranges :: size ( E ) が現れると結果となります。
目次 |
カスタマイゼーションポイントオブジェクト
名前
ranges::size
は
カスタマイゼーションポイントオブジェクト
を表し、これは
関数オブジェクト
のconstな
リテラル
semiregular
クラス型である。詳細は
CustomizationPointObject
を参照。
注記
式 ranges :: size ( e ) が有効である場合、戻り値の型は integer-like です。
C++20標準では、基となる
size
関数呼び出しがprvalueを返す場合、戻り値は具体化された一時オブジェクトからムーブ構築されることが要求されていました。しかし、すべての実装では直接prvalueを返しています。この要件は、C++20以降の提案
P0849R8
によって実装に合わせて修正されました。
式 ranges:: distance ( e ) は範囲 e のサイズを決定するためにも使用できます。 ranges :: size ( e ) とは異なり、 ranges:: distance ( e ) は e がサイズ指定のない範囲である場合でも機能しますが、その場合には線形計算量というコストがかかります。
例
#include <iostream> #include <ranges> #include <type_traits> #include <vector> int main() { auto v = std::vector<int>{}; std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n'; auto il = {7}; // std::initializer_list std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n'; int array[]{4, 5}; // array has a known bound std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n'; static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false); }
出力:
ranges::size(v) == 0 ranges::size(il) == 1 ranges::size(array) == 2
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2602R2 | C++20 |
ADL
によって発見される特定の非メンバー
size
を禁止する仕組みが存在する
|
そのような仕組みを削除 |
関連項目
|
(C++20)
|
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲が定数時間でそのサイズを知ることを指定する
(コンセプト) |
|
(C++20)
|
イテレータとセンチネル間、または範囲の先頭と終端間の距離を返す
(アルゴリズム関数オブジェクト) |
|
(C++17)
(C++20)
|
コンテナまたは配列のサイズを返す
(関数テンプレート) |