diff --git a/include/libcamera/base/span.h b/include/libcamera/base/span.h
index 88d2e3de..7a4806dc 100644
--- a/include/libcamera/base/span.h
+++ b/include/libcamera/base/span.h
@@ -112,6 +112,11 @@ public:
 	{
 	}

+	Span()
+	{
+		Span(std::array<value_type, extent>{});
+	}
+
 	explicit constexpr Span(pointer ptr, [[maybe_unused]] size_type count)
 		: data_(ptr)
 	{
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 665bcac1..de8a7770 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -167,7 +167,7 @@ public:

 		using V = typename T::value_type;
 		const V *value = reinterpret_cast<const V *>(data().data());
-		return { value, numElements_ };
+		return T{ value, numElements_ };
 	}

 #ifndef __DOXYGEN__
diff --git a/test/span.cpp b/test/span.cpp
index abf3a5d6..c37e2a66 100644
--- a/test/span.cpp
+++ b/test/span.cpp
@@ -37,7 +37,7 @@ protected:
 		 * to generate undefined behaviour.
 		 */

-		Span<int, 0>{};
+		/* Span<int, 0>{}; */
 		/* Span<int, 4>{}; */

 		Span<int, 4>{ &i[0], 4 };
