diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 1a5690a5ccbe..fe4b159eb172 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -353,6 +353,14 @@ public:
 	ControlList(const ControlIdMap &idmap, ControlValidator *validator = nullptr);
 	ControlList(const ControlInfoMap &infoMap, ControlValidator *validator = nullptr);
 
+	ControlList(const ControlList &other) = default;
+	ControlList(ControlList &&other) = default;
+	ControlList(const ControlList &&other) = delete;
+
+	ControlList &operator=(const ControlList &other) = default;
+	ControlList &operator=(ControlList &&other) = default;
+	ControlList &operator=(const ControlList &&other) = delete;
+
 	using iterator = ControlListMap::iterator;
 	using const_iterator = ControlListMap::const_iterator;
 
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index c58ed3946f3b..53957322c505 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -821,6 +821,36 @@ ControlList::ControlList(const ControlInfoMap &infoMap, ControlValidator *valida
 {
 }
 
+/**
+ * \fn ControlList::ControlList(const ControlList &other)
+ * \brief Copy constructor, construct a ControlList by copying \a other
+ * \param[in] other The ControlList to copy content from
+ */
+
+/**
+ * \fn ControlList::ControlList(ControlList &&other)
+ * \brief Move constructor, construct a ControlList by moving \a other
+ * \param[in] other The ControlList to move content from
+ *
+ * Upon return the \a other ControlList is empty.
+ */
+
+/**
+ * \fn ControlList::operator=(const ControlList &other)
+ * \brief Copy assignment operator, replace the content of the ControlList with
+ * a copy of \a other
+ * \param[in] other The ControlList to copy content from
+ */
+
+/**
+ * \fn ControlList::operator=(ControlList &&other)
+ * \brief Move assignment operator, replace the content of the ControlList with
+ * the content of \a other
+ * \param[in] other The ControlList to move content from
+ *
+ * Upon return the \a other ControlList is empty.
+ */
+
 /**
  * \typedef ControlList::iterator
  * \brief Iterator for the controls contained within the list
