std::ranges:: ssize
|
定義先ヘッダ
<ranges>
|
||
|
定義先ヘッダ
<iterator>
|
||
|
inline
namespace
/* unspecified */
{
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 ) は expression-equivalent で static_cast < std:: ptrdiff_t > ( ranges:: size ( t ) ) となる。 - それ以外の場合、 ranges :: ssize ( E ) は expression-equivalent で 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)
|
コンテナまたは配列のサイズを返す
(関数テンプレート) |