diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h
index cb642e0a9..0552a9f30 100644
--- a/include/libcamera/base/bound_method.h
+++ b/include/libcamera/base/bound_method.h
@@ -97,9 +97,9 @@ private:
 		[[maybe_unused]] auto *args = static_cast<PackType *>(pack);
 
 		if constexpr (!std::is_void_v<R>)
-			args->ret_ = invoke(std::get<I>(args->args_)...);
+			args->ret_ = invoke(std::forward<std::remove_cv_t<Args>>(std::get<I>(args->args_))...);
 		else
-			invoke(std::get<I>(args->args_)...);
+			invoke(std::forward<std::remove_cv_t<Args>>(std::get<I>(args->args_))...);
 	}
 
 public:
