diff --git a/CMakeLists.txt b/CMakeLists.txt index e5e2e317313b..fcaa7ffa4fa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ set(FMT_CAN_MODULE OFF) if (CMAKE_CXX_STANDARD GREATER 17 AND # msvc 16.10-pre4 MSVC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.29.30035) - set(FMT_CAN_MODULE ON) + set(FMT_CAN_MODULE OFF) endif () if (NOT FMT_CAN_MODULE) set(FMT_MODULE OFF) diff --git a/include/fmt/args.h b/include/fmt/args.h index 562e8ab11185..36f62220c069 100644 --- a/include/fmt/args.h +++ b/include/fmt/args.h @@ -143,6 +143,18 @@ class dynamic_format_arg_store } public: + constexpr dynamic_format_arg_store() = default; + + constexpr dynamic_format_arg_store( + const dynamic_format_arg_store& store) + : +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + basic_format_args(), +#endif + data_(store.data_), + named_info_(store.named_info_) { + } + /** \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 a7421bc5299d..2b1db8c8dfb4 100644 --- a/test/args-test.cc +++ b/test/args-test.cc @@ -171,3 +171,16 @@ TEST(args_test, throw_on_copy) { } EXPECT_EQ(fmt::vformat("{}", store), "foo"); } + +TEST(args_test, copy_constructor) { + auto store = fmt::dynamic_format_arg_store(); + store.push_back(fmt::arg("test1", "value1")); + store.push_back(fmt::arg("test2", "value2")); + store.push_back(fmt::arg("test3", "value3")); + + auto store2 = store; + store2.push_back(fmt::arg("test4", "value4")); + + auto result = fmt::vformat("{test1} {test2} {test3} {test4}", store2); + EXPECT_EQ(result, "value1 value2 value3 value4"); +}