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 <memory>, don't use make_unique
This commit is contained in:
lucpelletier 2021-12-23 14:34:16 -05:00 committed by GitHub
parent 664cd6067d
commit 7812813a32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 3 deletions

View File

@ -145,9 +145,6 @@ class dynamic_format_arg_store
public: public:
constexpr dynamic_format_arg_store() = default; constexpr dynamic_format_arg_store() = default;
constexpr dynamic_format_arg_store(
const dynamic_format_arg_store<Context>& store) = delete;
/** /**
\rst \rst
Adds an argument into the dynamic store for later passing to a formatting Adds an argument into the dynamic store for later passing to a formatting

View File

@ -7,6 +7,8 @@
#include "fmt/args.h" #include "fmt/args.h"
#include <memory>
#include "gtest/gtest.h" #include "gtest/gtest.h"
TEST(args_test, basic) { TEST(args_test, basic) {
@ -171,3 +173,21 @@ TEST(args_test, throw_on_copy) {
} }
EXPECT_EQ(fmt::vformat("{}", store), "foo"); 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<fmt::dynamic_format_arg_store<fmt::format_context>>
store_uptr(new fmt::dynamic_format_arg_store<fmt::format_context>());
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<fmt::format_context> 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);
}