template<typename T, typename U>
auto fun(T x, U y) -> decltype (x+y)
{
    return x+y;
}


template<typename T, typename U>
auto fun(T&& t, U&& u) -> decltype (forward<T>(t) + forward<U>(u))
{
    return forward<T>(t) + forward<U>(u);
};