std::ranges::ssize
| ヘッダ <ranges> で定義 |
||
| ヘッダ <iterator> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* unspecified */ ssize = /* unspecified */; |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(C++20以降) | |
定数時間で t の要素数を計算し、結果を符号付き型に変換します。
t が(具現化された)結果オブジェクトを表す、完全な式 E について、
- もし ranges::size(t) がill-formed ならば、 ranges::ssize(E) もill-formed です。
- そうでなければ、
Signedをmake-signed-like-t<decltype(ranges::size(t))> とします。- もし std::ptrdiff_t が
Signedよりも広い型であれば、 ranges::ssize(E) は static_cast<std::ptrdiff_t>(ranges::size(t)) と 式として同等です。 - そうでなければ、 ranges::ssize(E) は static_cast<Signed>(ranges::size(t)) と式として同等です。
- もし std::ptrdiff_t が
目次 |
カスタマイゼーションポイントオブジェクト
ranges::ssize という名前は、定数 関数オブジェクトであり、 リテラルな semiregular クラス型の カスタマイズポイントオブジェクト を表します。説明のため、その型の cv 修飾されていないバージョンを __ssize_fn と表記します。
__ssize_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __ssize_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が lvalue か rvalue か、あるいは const 修飾されているかどうかに関わらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能であることが要求されません)。したがって、ranges::ssize は自由にコピーでき、そのコピーは相互に交換可能です。
型のセット Args... が与えられたとき、 std::declval<Args>()... が上記の ranges::ssize への引数の要件を満たす場合、 __ssize_fn は以下をモデル化します。
- std::invocable<__ssize_fn, Args...>,
- std::invocable<const __ssize_fn, Args...>,
- std::invocable<__ssize_fn&, Args...>、そして
- std::invocable<const __ssize_fn&, Args...>.
そうでなければ、 __ssize_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] 注釈
式 e に対して ranges::ssize(e) が有効である場合、戻り値の型は 符号付き整数ライクな型 です。
[編集] 例
#include <array> #include <iostream> #include <ranges> #include <type_traits> int main() { std::array arr{1, 2, 3, 4, 5}; auto s = std::ranges::ssize(arr); std::cout << "ranges::ssize(arr) = " << s << '\n' << "ranges::ssize is " << (std::is_signed_v<decltype(s)> ? "signed" : "unsigned") << '\n'; std::cout << "reversed arr: "; for (--s; s >= 0; --s) std::cout << arr[s] << ' '; std::cout << "\n" "s = " << s << '\n'; }
出力
ranges::ssize(arr) = 5 ranges::ssize is signed reversed arr: 5 4 3 2 1 s = -1
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3403 | C++20 | ranges::size は一部の非レンジ型で機能しましたが、 ranges::ssize は機能しませんでした。 |
修正されました。 |
[編集] 関連項目
| (C++20) |
rangeのサイズと等しい整数を返す (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
rangeが定数時間でそのサイズを知っていることを規定する (コンセプト) |
| (C++20) |
イテレータと番兵 (sentinel) の間の距離、またはRangeの始点と終点の間の距離を返す (アルゴリズム関数オブジェクト) |
| (C++17)(C++20) |
コンテナまたは配列のサイズを返す (関数テンプレート) |