std::ranges::subrange<I,S,K>::operator PairLike
template< /*different-from*/<subrange> PairLike > requires /*pair-like-convertible-from*/<PairLike, const I&, const S&> |
(1) | (C++20 起) |
辅助概念 |
||
template< class T > concept /*pair-like*/ = // 仅用于阐释 |
(2) | (C++20 起) |
template< class T, class U, class V > concept /*pair-like-convertible-from*/ = // 仅用于阐释 |
(3) | (C++20 起) |
subrange
为 pair 式类型(即实现 pair-like
的类型,见后述)。等价于 return PairLike(i_, s_); ,其中 i_
与 s_
分别为存储的迭代器与哨位。此转换函数拥有 pair-like-convertible
(见后述)所施加的额外约束。pair-like
指定类型为 pair 式类型。通常而言, pair 式类型的表达式 e 能用于结构化绑定(即 auto const& [x, y] = e; 通常为良构)。同标准概念,此概念得到实现,若它得到满足且其蕴含的所有概念均得到实现。pair-like-convertible-from
细化 pair-like
。它拒绝 range
类型,并要求 U
与 V
分别可转换成 T
的第一与第二元素类型,并且从 U
(将被替换成 const I& )的转换为非切片(见 convertible-to-non-slicing )。同标准概念,此概念得到实现,若它得到满足且其蕴含的所有概念均得到实现。仅用于阐释的概念 different-from
为类型 T
与 U
实现,当且仅当 std::decay_t<T> 与 std::decay_t<U> 是不同的类型。
参数
(无)
返回值
从存储的迭代器与哨位直接初始化 PairLike
值。
注解
下列类型为 pair 式:
- std::pair<T, U>
- std::tuple<T, U>
- std::array<T, 2>
- std::ranges::subrange<I, S, K>
从这些类型之一或 std::variant 特化派生的程序定义类型为 pair 式,若
-
std::tuple_size
与std::tuple_element
对它正确特化,且 - 对其值调用 std::get<0> 与 std::get<1> 为良构。
由于 subrange
特化是 range
类型,到它们的转换不经由此转换函数进行。
std::array 特化不能从 subrange
转换而来,因为它们是 range
类型。
示例
#include <iostream> #include <ranges> #include <string> #include <utility> using legacy_strview = std::pair< std::string::const_iterator, std::string::const_iterator >; 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