Namespaces
Variants

deduction guides for std::ranges::subrange

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
template < std:: input_or_output_iterator I, std:: sentinel_for < I > S >
subrange ( I, S ) - > subrange < I, S > ;
(1) (C++20 起)
template < std:: input_or_output_iterator I, std:: sentinel_for < I > S >

subrange ( I, S, /*make-unsigned-like-t*/ < std:: iter_difference_t < I >> ) - >

subrange < I, S, ranges :: subrange_kind :: sized > ;
(2) (C++20 起)
template < ranges:: borrowed_range < R > >

subrange ( R && ) - >
subrange < ranges:: iterator_t < R > , ranges:: sentinel_t < R > ,
( ranges:: sized_range < R > ||
std:: sized_sentinel_for < ranges:: sentinel_t < R > ,
ranges:: iterator_t < R >> ) ?

ranges :: subrange_kind :: sized : ranges :: subrange_kind :: unsized > ;
(3) (C++20 起)
template < ranges:: borrowed_range < R > >

subrange ( R && , /*make-unsigned-like-t*/ < ranges:: range_difference_t < R >> ) - >
subrange < ranges:: iterator_t < R > , ranges:: sentinel_t < R > ,

ranges :: subrange_kind :: sized > ;
(4) (C++20 起)

这些 推导指引 是为 std::ranges::subrange 提供的。

1) 从迭代器和哨兵的类型推导模板参数。若满足 std:: sized_sentinel_for < S, I > 条件(由默认模板参数确定),则该 subrange 为大小已知范围。
2) 根据迭代器和哨兵的类型推导模板参数,同时指定范围的大小。 subrange 始终是带大小的。
3) 从范围类型推导模板参数。当大小可从范围或其迭代器与哨位获取时,该 subrange 为带大小规格的。
4) 从范围类型推导模板参数,同时指定范围的大小。 subrange 始终是带大小的。

关于 /* make-unsigned-like-t */ 的定义,请参见 make-unsigned-like-t 。

注释

在构造 subrange 对象时,

  • 对于 (1,2) ,若迭代器-哨位对不表示有效范围,则行为未定义,
  • 对于 (2,4) ,若给定大小不等于范围大小,则行为未定义。

示例

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 应用于 发布时行为 正确行为
LWG 3404 C++20 提供了来自类pair类型的无意义推导指引 已移除