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)); +}