std::ranges:: ssize
|
定义于头文件
<ranges>
|
||
|
定义于头文件
<iterator>
|
||
|
inline
namespace
/* 未指定 */
{
inline
constexpr
/* 未指定 */
ssize
=
/* 未指定 */
;
|
(C++20 起)
(定制点对象) |
|
|
调用签名
|
||
|
template
<
class
T
>
requires
/* 见下文 */
|
(C++20 起) | |
在常量时间内计算 t 中的元素数量,并将结果转换为有符号类型。
给定 子表达式 ,其中 t 表示(可能经过 临时物化 的)结果对象,记作 E :
- 若 ranges:: size ( t ) 的格式不正确,则 ranges :: ssize ( E ) 同样格式不正确。
-
否则,令
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
类类型的常量
函数对象
。详细信息请参阅
定制点对象
。
注释
如果表达式 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++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3403 | C++20 |
ranges::size
对某些非范围类型有效但
ranges::ssize
无效
|
已修复 |
参见
|
(C++20)
|
返回等于范围大小的整数值
(定制点对象) |
|
(C++20)
|
规定范围能在常数时间内获知其大小
(概念) |
|
(C++20)
|
返回迭代器与哨位之间,或范围起始与末尾之间的距离
(算法函数对象) |
|
(C++17)
(C++20)
|
返回容器或数组的大小
(函数模板) |