具有单个参数的 std::min() 的实现是什么?

What is the implementation of std::min() that has a single parameter?

我在一段代码中看到如下语句:

std::min(0);

我能找到的最接近的定义是:

template <class T> constexpr T min (initializer_list<T> il);

到目前为止,我在 stl_algo.h:

中找到了实现
template<typename _Tp>
    _GLIBCXX14_CONSTEXPR
    inline _Tp
    min(initializer_list<_Tp> __l)
    { return *std::min_element(__l.begin(), __l.end()); }

以前以为std::min()只是计算两项中的最小值。任何人都可以向我解释它实际上做了什么吗?什么是 initializer_list

要回答标题中的问题,当一组数字包含一个数字时,一组数字中的最小值就是数字本身。这对我来说很容易理解。希望你也能明白。

I used to think that std::min() only calculates the minimum of two items.

它曾经是,但从 C++11 开始,它发生了变化。从 C++11 开始,有

template< class T >
T min( std::initializer_list<T> ilist );

和一些变体。它可以用作:

std::min({num1, num2, ..., numn});

我很惊讶

std::min(0);

适合你。它不应该。也许 g++ 支持它作为 non-standard 扩展。但是,您应该可以使用

std::min({0}); // That becomes an intializer_list<int> with one item.

符合标准。

mininitializer_list 的实际效果如何?

这个 min 函数变体将它的工作推迟到 std::min_element, which finds minimum element in a range defined by a pair of iterators. std::initializer_list<T> 是一个轻量级代理对象,它提供对 const T 类型对象数组的访问,范围为 [begin(), end())

采用一个或多个参数的简单可变 min 函数:

#include <type_traits>

template <typename... Ts>
struct all_same {};

template <>
struct all_same<> {
    constexpr static bool value = true;
};

template <typename T>
struct all_same<T> {
    constexpr static bool value = true;
};

template <typename T, typename U, typename... Rest>
struct all_same<T, U, Rest...> {
    constexpr static bool value = std::is_same_v<T, U> && all_same<U, Rest...>::value;
};

template <typename... Ts>
inline constexpr bool all_same_v = all_same<Ts...>::value;

template <typename T>
constexpr const T& min(const T& value) {
    return value;
}

template <typename T, typename... U>
constexpr std::enable_if_t<all_same_v<T, U...>, const T&> min(const T& first,
                                                              const T& second,
                                                              const U&... rest) {
    return first <= second ? min(first, rest...) : min(second, rest...);
}

// min(1); // equals to 1
// min(4, 3, 2, 1, 2, 3); // equals to 1

On Coliru