diff --git a/dune/subgrid/common/variant.hh b/dune/subgrid/common/variant.hh
index e2132ea6c66de8266669eb87f8b9a44fe6143837..484e5fe8cb922e8695958fded77856a09262f2f9 100644
--- a/dune/subgrid/common/variant.hh
+++ b/dune/subgrid/common/variant.hh
@@ -125,10 +125,11 @@ namespace Impl {
     }
 
     template<typename Tp>
-    void set(Tp obj) {
-      Dune::Hybrid::ifElse(std::is_same<Tp, Head_>(),
-        [&](auto&& id)    { head_=std::move(id(obj)); },
-        [&](auto&& id) { return id(tail_).set(std::move(obj)); }
+    void set(Tp&& obj) {
+      using T = std::decay_t<Tp>;
+      Dune::Hybrid::ifElse(std::is_same<T, Head_>(),
+        [&](auto&& id)    { id(head_)=std::forward<Tp>(obj); },
+        [&](auto&& id) { return id(tail_).set(std::forward<Tp>(obj)); }
       );
     }