From 57c8ff9befd19c077f73de7adc7a72475ad03b0a Mon Sep 17 00:00:00 2001 From: Barry Revzin Date: Wed, 25 Jan 2023 21:56:09 -0600 Subject: [PATCH] Allowing formatting non-copyable ranges. --- include/fmt/ranges.h | 3 +-- test/ranges-test.cc | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/fmt/ranges.h b/include/fmt/ranges.h index 0b6ec900..d65de361 100644 --- a/include/fmt/ranges.h +++ b/include/fmt/ranges.h @@ -154,8 +154,7 @@ struct has_const_begin_end< template struct has_mutable_begin_end< T, void_t())), - decltype(detail::range_end(std::declval())), - enable_if_t::value>>> + decltype(detail::range_end(std::declval()))>> : std::true_type {}; template diff --git a/test/ranges-test.cc b/test/ranges-test.cc index fa46fc41..ae069665 100644 --- a/test/ranges-test.cc +++ b/test/ranges-test.cc @@ -406,3 +406,16 @@ TEST(ranges_test, range_of_range_of_mixed_const) { TEST(ranges_test, vector_char) { EXPECT_EQ(fmt::format("{}", std::vector{'a', 'b'}), "['a', 'b']"); } + +TEST(ranges_test, range_of_noncopyable) { + struct V { + int i; + V(int v) : i(v) { } + V(V&&) = default; + auto operator=(V&&) -> V& = default; + + auto begin() -> int* { return &i; } + auto end() -> int* { return &i + 1; } + }; + EXPECT_EQ(fmt::format("{}", V(1)), "[1]"); +}