diff --git a/include/fmt/base.h b/include/fmt/base.h index 378d79f9..f9fd350d 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -876,20 +876,20 @@ template struct format_as_result { }; template using format_as_t = typename format_as_result::type; -template +template constexpr auto has_const_formatter_impl(T*) - -> decltype(typename Context::template formatter_type().format( - std::declval(), std::declval()), + -> decltype(formatter().format( + std::declval(), + std::declval&>()), true) { return true; } -template -constexpr auto has_const_formatter_impl(...) -> bool { +template constexpr auto has_const_formatter_impl(...) -> bool { return false; } -template +template constexpr auto has_const_formatter() -> bool { - return has_const_formatter_impl(static_cast(nullptr)); + return has_const_formatter_impl(static_cast(nullptr)); } struct unformattable {}; @@ -1002,7 +1002,7 @@ template struct arg_mapper { template > struct formattable - : bool_constant() || + : bool_constant() || (std::is_constructible>::value && !std::is_const::value)> {}; @@ -2341,7 +2341,7 @@ template class value { auto f = Formatter(); parse_ctx.advance_to(f.parse(parse_ctx)); using qualified_type = - conditional_t(), const T, T>; + conditional_t(), const T, T>; // format must be const for compatibility with std::format and compilation. const auto& cf = f; ctx.advance_to(cf.format(*static_cast(arg), ctx)); diff --git a/test/base-test.cc b/test/base-test.cc index 3d5a74ab..c5ba3a80 100644 --- a/test/base-test.cc +++ b/test/base-test.cc @@ -820,9 +820,9 @@ TEST(base_test, format_explicitly_convertible_to_std_string_view) { TEST(base_test, has_const_formatter) { EXPECT_TRUE((fmt::detail::has_const_formatter())); + char>())); EXPECT_FALSE((fmt::detail::has_const_formatter())); + char>())); } TEST(base_test, format_nonconst) {