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