# std::ranges::min_max_result

< cpp‎ | algorithm‎ | ranges

定义于头文件 `<algorithm>` |  |
template <class T> struct min_max_result; |  | (C++20 起)

`ranges::min_max_result` 是类模板，提供存储二个同类型对象或引用为单个单元的方式。

此类模板无基类或显示如下的声明的数据成员，从而它适合用于结果化绑定。

此类模板的所有特殊成员函数均为隐式声明，这使得特化为聚合类，并传播数据成员上的操作的平凡性、潜在抛出性及 constexpr 性质。

### 模板形参

T | - | `ranges::min_max_result` 所存储的对象或引用的类型

### 数据成员

## std::ranges::min_max_result::min

[[no_unique_address]] T min; |  |

可能为到范围中最小元素的引用、指向它的迭代器或其副本。

## std::ranges::min_max_result::max

[[no_unique_address]] T max; |  |

可能为到范围中最大元素的引用、指向它的迭代器或其副本。

### 成员函数

## std::ranges::min_max_result::operator min_max_result<T2>

template<class T2> requires std::convertible_to<const T&, T2> constexpr operator min_max_result<T2>() const &; | (1) |
template<class T2> requires std::convertible_to<T, T2> constexpr operator min_max_result<T2>() &&; | (2) |

通过从 *this 的每个数据成员构造结果的对应成员，转换 *this 为结果。

1) 等价于 return {min, max}; 。
2) 等价于 return {std::move(min), std::move(max)}; 。

### 标准库

下列标准库函数以 `ranges::min_max_result` 为返回类型：

##### 算法函数
ranges::minmax (C++20) | 返回两个元素的较小和较大者 (niebloid)
ranges::minmax_element (C++20) | 返回范围中的最小和最大元素 (niebloid)

### 概要

    namespace std::ranges {
        template<class T>
        struct min_max_result {
            [[no_unique_address]] T min;
            [[no_unique_address]] T max;

            template<class T2>
            requires std::convertible_to<const T&, T2>
            constexpr operator min_max_result<T2>() const & {
                return {min, max};
            }

            template<class T2>
            requires std::convertible_to<T, T2>
            constexpr operator min_max_result<T2>() && {
                return {std::move(min), std::move(max)};
            }
        };
    }

### 注解

每个使用此返回类型族的标准库算法声明新的别名类型，例如 using merge_result = in_in_out_result<I1, I2, O>; 。

这些别名族的名称由添加 "`_result`" 到算法名组成。故 `std::ranges::merge` 的返回类型能命名为 `std::ranges::merge_result` 。

不同于 std::pair 与 std::tuple ，此类模板的拥有名字有意义的数据成员。

### 示例

    #include <algorithm>
    #include <ranges>

    int main()
    {
        constexpr static auto v = {3, 1, 4, 1, 5, 9, 2};
        {
            constexpr auto result = std::ranges::minmax(v);
            static_assert(1 == result.min && 9 == result.max);
        }
        {
            constexpr auto result = std::ranges::minmax_element(v);
            static_assert(1 == *result.min && 9 == *result.max);
        }
    }

### 参阅

pair | 实现二元组，即一对值 (类模板)
tuple (C++11) | 实现固定大小的容器，它保有类型可以相异的元素 (类模板)