From 7812813a3229e6badaf011157760445ec8d7e5af Mon Sep 17 00:00:00 2001 From: lucpelletier Date: Thu, 23 Dec 2021 14:34:16 -0500 Subject: [PATCH] Don't explicitly delete copy ctor of dynamic_format_arg_store (#2664) * Don't explicitly delete copy ctor of dynamic_format_arg_store Explicitly deleting the copy ctor causes the move constructor to not be implicitly generated. This behaviour is different than what was in v8.0.1 and causes code that relied on the move ctor of dynamic_format_arg_store to break. * Add test for dynamic_format_arg_store's move ctor * include , don't use make_unique --- include/fmt/args.h | 3 --- test/args-test.cc | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/fmt/args.h b/include/fmt/args.h index 99060040..9a8e4ed2 100644 --- a/include/fmt/args.h +++ b/include/fmt/args.h @@ -145,9 +145,6 @@ class dynamic_format_arg_store public: constexpr dynamic_format_arg_store() = default; - constexpr dynamic_format_arg_store( - const dynamic_format_arg_store& store) = delete; - /** \rst Adds an argument into the dynamic store for later passing to a formatting diff --git a/test/args-test.cc b/test/args-test.cc index e793cb5c..d9afbc1a 100644 --- a/test/args-test.cc +++ b/test/args-test.cc @@ -7,6 +7,8 @@ #include "fmt/args.h" +#include + #include "gtest/gtest.h" TEST(args_test, basic) { @@ -171,3 +173,21 @@ TEST(args_test, throw_on_copy) { } EXPECT_EQ(fmt::vformat("{}", store), "foo"); } + +TEST(args_test, move_constructor) { + const int test_integer = 42; + const char* const test_c_string = "foo"; + + std::unique_ptr> + store_uptr(new fmt::dynamic_format_arg_store()); + store_uptr->push_back(test_integer); + store_uptr->push_back(std::string(test_c_string)); + store_uptr->push_back(fmt::arg("a1", test_c_string)); + + fmt::dynamic_format_arg_store moved_store( + std::move(*store_uptr)); + store_uptr.reset(); + EXPECT_EQ( + fmt::vformat("{} {} {a1}", moved_store), + std::to_string(test_integer) + " " + test_c_string + " " + test_c_string); +}