diff --git a/dune/matrix-vector/algorithm.hh b/dune/matrix-vector/algorithm.hh
index 5f618a1bdcffbd5e4359658bc6ab4e2674e58afb..b8bb947371ee83fe1fefce12a5b688e011fa34b8 100644
--- a/dune/matrix-vector/algorithm.hh
+++ b/dune/matrix-vector/algorithm.hh
@@ -15,19 +15,24 @@ namespace MatrixVector {
  * \brief Hybrid for loop over sparse range
  */
 template <class Range, class F,
-          typename = std::enable_if_t<Dune::IsTupleOrDerived<Range>::value>>
-void sparseRangeFor(const Range& range, F&& f) {
+          std::enable_if_t<Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0>
+void sparseRangeFor(Range&& range, F&& f) {
   using namespace Dune::Hybrid;
-  forEach(integralRange(size(range)), [&](auto&& i) { f(range[i], i); });
+  forEach(integralRange(size(range)), [&](auto&& i) {
+      f(range[i], i);
+  });
 }
 
 /**
  * \brief Hybrid for loop over sparse range
  */
-template<class Range, class F>
+template<class Range, class F,
+          std::enable_if_t<not Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0>
 void sparseRangeFor(Range&& range, F&& f)
 {
-  for (auto it = range.begin(); it != range.end(); ++it)
+  auto it = range.begin();
+  auto end = range.end();
+  for (; it != end; ++it)
     f(*it, it.index());
 }