# std::ranges::subrange<I,S,K>::operator PairLike

< cpp‎ | ranges‎ | subrange

template< /*different-from*/<subrange> PairLike > requires /*pair-like-convertible-from*/<PairLike, const I&, const S&> constexpr operator PairLike() const; | (1) | (C++20 起)
辅助概念 |  |
template< class T > concept /*pair-like*/ = // 仅用于阐释 !std::is_reference_v<T> && requires(T t) { typename std::tuple_size<T>::type; // 确保 std::tuple_size<T> 完整 requires std::derived_from<std::tuple_size<T>, std::integral_constant<std::size_t, 2>>; typename std::tuple_element_t<0, std::remove_const<T>>; typename std::tuple_element_t<1, std::remove_const<T>>; { std::get<0>(t) } -> std::convertible_to<const std::tuple_element_t<0, T>&>; { std::get<1>(t) } -> std::convertible_to<const std::tuple_element_t<1, T>&>; }; | (2) | (C++20 起)
template< class T, class U, class V > concept /*pair-like-convertible-from*/ = // 仅用于阐释 !ranges::range<T> && /*pair-like*/<T> && std::constructible_from<T, U, V> && /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> && std::convertible_to<V, std::tuple_element_t<1, T>>; | (3) | (C++20 起)

1) 转换 `subrange` 为 pair 式类型（即实现 `pair-like` 的类型，见后述）。等价于 return PairLike(i_, s_); ，其中 `i_` 与 `s_` 分别为存储的迭代器与哨位。此转换函数拥有 `pair-like-convertible` （见后述）所施加的额外约束。
2) 仅用于阐释的概念 `pair-like` 指定类型为 pair 式类型。通常而言， pair 式类型的表达式 e 能用于结构化绑定（即 auto const& [x, y] = e; 通常为良构）。同标准概念，此概念得到实现，若它得到满足且其蕴含的所有概念均得到实现。
3) 仅用于阐释的概念 `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