diff --git a/include/fmt/core.h b/include/fmt/core.h index bda0e078..2f309501 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -570,9 +570,8 @@ FMT_MAKE_VALUE(cstring_type, signed char*, const signed char*) FMT_MAKE_VALUE(cstring_type, const signed char*, const signed char*) FMT_MAKE_VALUE(cstring_type, unsigned char*, const unsigned char*) FMT_MAKE_VALUE(cstring_type, const unsigned char*, const unsigned char*) -FMT_MAKE_VALUE(string_type, basic_string_view, - basic_string_view) -FMT_MAKE_VALUE(string_type, const std::basic_string&, +FMT_MAKE_VALUE(string_type, basic_string_view, basic_string_view) +FMT_MAKE_VALUE(string_type, const std::basic_string&, basic_string_view) FMT_MAKE_VALUE(pointer_type, void*, const void*) FMT_MAKE_VALUE(pointer_type, const void*, const void*) @@ -593,9 +592,11 @@ inline typename std::enable_if< typed_value>::type make_value(const T &val) { return static_cast(val); } -template -inline typename std::enable_if::value, typed_value>::type +template +inline typename std::enable_if< + !convert_to_int::value && + !std::is_convertible>::value, + typed_value>::type make_value(const T &val) { return val; } template diff --git a/test/format-test.cc b/test/format-test.cc index 56a1f879..af4018dc 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1213,6 +1213,16 @@ TEST(FormatterTest, FormatStringView) { EXPECT_EQ("test", format("{0}", string_view("test"))); } +struct ConvertibleToString { + std::string s; + ConvertibleToString() : s("foo") {} + operator const std::string &() const { return s; } +}; + +TEST(FormatterTest, FormatConvertibleToString) { + EXPECT_EQ("foo", format("{}", ConvertibleToString())); +} + namespace fmt { template <> struct formatter {