diff --git a/SG14/inplace_function.h b/SG14/inplace_function.h index 1ca1cd01..5c2e9c73 100644 --- a/SG14/inplace_function.h +++ b/SG14/inplace_function.h @@ -101,9 +101,9 @@ template struct vtable template explicit constexpr vtable(wrapper) noexcept : invoke_ptr{ [](storage_ptr_t storage_ptr, Args&&... args) - noexcept(noexcept(std::declval()(args...))) -> R + noexcept(noexcept(std::declval()(static_cast(args)...))) -> R { return (*static_cast(storage_ptr))( - std::forward(args)... + static_cast(args)... ); } }, copy_ptr{ [](storage_ptr_t dst_ptr, storage_ptr_t src_ptr) diff --git a/SG14_test/inplace_function_test.cpp b/SG14_test/inplace_function_test.cpp index b213745d..3be08814 100644 --- a/SG14_test/inplace_function_test.cpp +++ b/SG14_test/inplace_function_test.cpp @@ -415,6 +415,20 @@ struct test_bug_32072 { static_assert(std::is_copy_constructible::value, ""); static_assert(std::is_nothrow_move_constructible::value, ""); +static void RvalueRefParameter() +{ + stdext::inplace_function&&)> f; + f = [](std::unique_ptr) {}; + f = [](std::unique_ptr&&) {}; + f = [](const std::unique_ptr&) {}; + f(std::make_unique(42)); + stdext::inplace_function)> g; + g = [](std::unique_ptr) {}; + g = [](std::unique_ptr&&) {}; + g = [](const std::unique_ptr&) {}; + g(std::make_unique(42)); +} + void sg14_test::inplace_function_test() { // first set of tests (from Optiver) @@ -427,6 +441,7 @@ void sg14_test::inplace_function_test() ContainingStdFunction(); SimilarTypeCopy(); FunctorDestruction(); + RvalueRefParameter(); // second set of tests using IPF = stdext::inplace_function;