std::ranges::ssize
From zh.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 );
|
(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)
|
返回容器或数组的大小
(函数模板) |