From 2f7c19f13907f985192e4f47831ce2bc48f608c0 Mon Sep 17 00:00:00 2001
From: Max Kellermann <mk@cm4all.com>
Date: Mon, 8 Apr 2024 21:07:34 +0200
Subject: [PATCH] util/SpanCast: rewrite ToStringView(std::span<std::byte>) to
 avoid cast ambiguities

---
 src/util/SpanCast.hxx | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/util/SpanCast.hxx b/src/util/SpanCast.hxx
index d786f9d89..10d45062c 100644
--- a/src/util/SpanCast.hxx
+++ b/src/util/SpanCast.hxx
@@ -89,15 +89,21 @@ ToStringView(std::span<const std::byte> s) noexcept
 	return ToStringView(FromBytesStrict<const char>(s));
 }
 
-constexpr std::string_view
-ToStringView(std::span<std::byte> s) noexcept
-{
-	return ToStringView(FromBytesStrict<const char>(s));
-}
-
 template<typename T>
 constexpr std::basic_string_view<std::remove_const_t<T>>
 ToStringView(std::span<T> s) noexcept
 {
 	return {s.data(), s.size()};
 }
+
+/* this overload matches std::span<std::byte> (without "const") and is
+   written that way to avoid ambiguities when passing an object that
+   has cast operators for both std::span<std::byte> and
+   std::span<const std::byte> */
+template<typename T>
+constexpr std::string_view
+ToStringView(std::span<T> s) noexcept
+	requires(std::is_same_v<std::remove_const_t<T>, std::byte>)
+{
+	return ToStringView(FromBytesStrict<const char>(s));
+}