c – min和完美转发

前端之家收集整理的这篇文章主要介绍了c – min和完美转发前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
min算法通常表示如下:
template <typename T>
const T& min(const T& x,const T& y)
{
    return y < x ? y : x;
}

但是,这不允许形式为min(a,b)= 0的构造.您可以通过额外的重载来实现:

template <typename T>
T& min(T& x,T& y)
{
    return y < x ? y : x;
}

我想做的是通过完美转发统一这两个重载:

template <typename T>
T&& min(T&& x,T&& y)
{
    return y < x ? std::forward<T>(y) : std::forward<T>(x);
}

但是,g 4.5.0向min(2,4)发出警告,我将返回对临时引用的引用.我做错什么了吗?

好的,我明白了.问题在于条件运算符.在我的第一个解决方案中,如果我调用min(2,4),条件运算符将看到xvalue,从而从转发的x移动以生成临时对象.当然,通过引用返回它是危险的!如果我单独转发整个表达式而不是x和y,编译器就不会再抱怨了:

template <typename T>
T&& min(T&& x,T&& y)
{
    return std::forward<T>(y < x ? y : x);
}

好的,我摆脱了算术类型的引用:)

#include <type_traits>

template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value,T>::type
min(T x,T y)
{
    return y < x ? y : x;
}

template <typename T>
typename std::enable_if<!std::is_arithmetic<T>::value,T&&>::type
min(T&& x,T&& y)
{
    return std::forward<T>(y < x ? y : x);
}

解决方法

在我看来,你正试图过度简化这个问题.不幸的是,让它完全正确无疑是非常重要的.如果你还没有读过 N2199,现在是时候这么做了. Rvalue引用继续发展,因此它的min和max的参考实现可能不再完全正确,但它至少应该是一个相当不错的起点.警告:参考实现比你想要的复杂得多!

猜你在找的C&C++相关文章