#include #include template class reverse; template class reverse { private: T& _iterable; public: explicit reverse(T& iterable) : _iterable{iterable} {} auto begin() const { return std::rbegin(_iterable); } auto end() const { return std::rend(_iterable); } }; template class reverse { private: T _iterable; public: explicit reverse(T&& iterable) : _iterable{std::move(iterable)} {} auto begin() const { return std::rbegin(_iterable); } auto end() const { return std::rend(_iterable); } }; template reverse(T&& v) -> reverse(v))>; //Usage: void foo(int); std::vector make_vec(); void test_lvalue(std::vector& lvalue) { for (auto i : reverse(lvalue)) { foo(i); } } void test_rvalue() { for (auto i : reverse(make_vec())) { foo(i); } }