【发布时间】:2016-09-18 04:47:31
【问题描述】:
标准算法min 和max 可以与单个值进行比较。但是,minmax 算法的返回值无法与一对值进行比较:
#include <algorithm>
#include <utility>
template<class T1, class T2>
constexpr auto make_cref_pair(T1&& t1, T2&& t2)
{
return std::pair<T1 const&, T2 const&>(std::forward<T1>(t1), std::forward<T2>(t2));
}
int main()
{
static_assert(std::min(2, 1) == 1); // OK
static_assert(std::max(2, 1) == 2); // OK
//static_assert(std::minmax(2, 1) == std::make_pair(1, 2)); // ERROR, const int& vs int pair comparison
static_assert(std::minmax(2, 1) == std::pair<const int&, const int&>(1, 2)); // OK
static_assert(std::minmax(2, 1) == make_cref_pair(1, 2)); // OK
}
原因是make_pair(2, 1) 返回一个pair<int, int> 而minmax(1, 2) 返回一个pair<const int&, const int&>。 pair 没有引用混合 operator== 重载。
然后解决方法是显式编写 std::pair<const int&, const int&>(int, int) 或将其包装在自制的 make_cref_pair 函数中。
问题:有没有更简洁的方法来比较 minmax 返回值和 pair 的值?我是否正确处理了make_cref_pair 中的引用?
【问题讨论】:
-
我担心
make_cref_pair可能不合法(延长寿命不适用于子对象,AFAIK) -
@sehe 哎呀。这同样适用于裸
pair<int const&, int const&>(1,2)吗? -
应该是一样的。我不太确定这一点,但它看起来确实像在边缘玩
-
也许另一种方法是自己提供适当的
operator==重载。在对象生命方面,它可能比cref_pair更安全,但另一方面它引入了“意外”的过载。 -
@sehe 看起来并不比
forward_as_tuple更危险。
标签: c++ algorithm c++14 minmax