std::ranges::subrange<I,S,K>::operator PairLike
| template< /* 见下文 */ PairLike > requires pair-like-convertible-from<PairLike, const I&, const S&> |
(1) | (C++20 起) |
| 辅助概念 |
||
| template< class T > concept pair-like = // 仅用于阐述 |
(2) | (C++20 起) (C++23 前) |
| (3) | ||
| template< class T, class U, class V > concept pair-like-convertible-from = // 仅用于阐述 |
(C++20 起) (C++23 前) |
|
| template< class T, class U, class V > concept pair-like-convertible-from = // 仅用于阐述 |
(C++23 起) | |
subrange 转换到对子式类型(即实现了在下文定义的概念 pair-like (C++23 前)pair-like (C++23 起) 的类型)。等价于 return PairLike(i_, s_);,其中 i_ 和 s_ 分别是存储的迭代器与哨位。pair-like-convertible(见下文)所施加的额外约束。pair-like 指定类型为对子式类型。通常而言,对子式类型的表达式 e 能用于结构化绑定(即 auto const& [x, y] = e; 通常良构)。此概念被标准库通用的概念 pair-like 替代。 (C++23 起)pair-like-convertible-from 细化 pair-like。它
- 拒绝引用类型和 (C++23 起)
range类型, - 要求
U和V分别可转换到T的第一和第二元素类型,并且 - 要求从
U(将被替换成 const I&)的转换为非切片(见 convertible-to-non-slicing)。
参数
(无)
返回值
从存储的迭代器与哨位直接初始化 PairLike 值。
注解
下列类型都是对子式的:
- std::pair<T, U>
- std::tuple<T, U>
- std::array<T, 2>
- std::ranges::subrange<I, S, K>
|
从这些类型之一派生的程序定义类型在满足以下条件时可以是对子式的:
|
(C++23 前) |
因为 subrange 特化是 range 类型,所以此转换函数不进行到它们的转换。
std::array 特化不能从 subrange 转换而来,因为它们是 range 类型。
示例
#include <iostream> #include <ranges> #include <string> #include <utility> using striter = std::string::const_iterator; using legacy_strview = std::pair<striter, striter>; void legacy_print(legacy_strview p) { for (; p.first != p.second; ++p.first) std::cout << *p.first << ' '; std::cout << '\n'; } int main() { std::string dat{"ABCDE"}; for (auto v{ std::ranges::subrange{dat} }; v; v = {v.begin(), v.end() - 1}) { /*...*/ legacy_print(legacy_strview{v}); } }
输出:
A B C D E A B C D A B C A B A