std::ranges::ssize
ja.cppreference.net より
| ヘッダ <ranges>
|
||
| で定義 <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ ssize = /* unspecified */;
}
|
ヘッダ で定義 |
|
| (C++20 以上) |
||
template< class T >
requires /* see below */
constexpr auto ssize( T&& t );
|
(カスタマイゼーションポイントオブジェクト) | |
呼び出しシグネチャt(C++20 以上)
内の要素数を定数時間で計算し、その結果を符号付き型に変換します。
を表す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
は
カスタマイゼーションポイントオブジェクト
を表し、これは
関数オブジェクト
のconstな
リテラル
semiregular
クラス型です。詳細は
CustomizationPointObject
を参照してください。
注記
式 ranges :: ssize ( e ) が有効な場合、戻り値の型は signed-integer-like type です。
例
このコードを実行
#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)
|
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲が定数時間で自身のサイズを知ることを指定する
(コンセプト) |
|
(C++20)
|
イテレータとセンチネル間、または範囲の先頭と終端間の距離を返す
(アルゴリズム関数オブジェクト) |
|
(C++17)
(C++20)
|
コンテナまたは配列のサイズを返す
(関数テンプレート) |