Allowing formatting non-copyable ranges.

This commit is contained in:
Barry Revzin 2023-01-25 21:56:09 -06:00
parent a2c05a10ec
commit 57c8ff9bef
2 changed files with 14 additions and 2 deletions

View File

@ -154,8 +154,7 @@ struct has_const_begin_end<
template <typename T>
struct has_mutable_begin_end<
T, void_t<decltype(detail::range_begin(std::declval<T>())),
decltype(detail::range_end(std::declval<T>())),
enable_if_t<std::is_copy_constructible<T>::value>>>
decltype(detail::range_end(std::declval<T>()))>>
: std::true_type {};
template <typename T>

View File

@ -406,3 +406,16 @@ TEST(ranges_test, range_of_range_of_mixed_const) {
TEST(ranges_test, vector_char) {
EXPECT_EQ(fmt::format("{}", std::vector<char>{'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]");
}