From 9e67c42b688ddeb9566de58b329f474c23bb2993 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Sat, 4 Jan 2020 10:31:36 +0100 Subject: [PATCH] Revert changes about Task This reverts commits 6349eaf761d8c7b80db00d48217890c20931964e and a96793ec8c496eec19daf68f3aa0c4eded2ea166. --- include/xbt/functional.hpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/include/xbt/functional.hpp b/include/xbt/functional.hpp index 2cf671a44a..f5bf973c40 100644 --- a/include/xbt/functional.hpp +++ b/include/xbt/functional.hpp @@ -192,11 +192,12 @@ private: { const static TaskVtable vtable { // Call: - [](TaskUnion& buffer, Args&&... args) { + [](TaskUnion& buffer, Args... args) { F* src = reinterpret_cast(&buffer); F code = std::move(*src); src->~F(); - return code(std::move(args)...); + // NOTE: std::forward(args)... is correct. + return code(std::forward(args)...); }, // Destroy: std::is_trivially_destructible::value ? @@ -221,10 +222,11 @@ private: { const static TaskVtable vtable { // Call: - [](TaskUnion& buffer, Args&&... args) { + [](TaskUnion& buffer, Args... args) { // Delete F when we go out of scope: std::unique_ptr code(*reinterpret_cast(&buffer)); - return (*code)(std::move(args)...); + // NOTE: std::forward(args)... is correct. + return (*code)(std::forward(args)...); }, // Destroy: [](TaskUnion& buffer) { @@ -244,13 +246,15 @@ public: operator bool() const { return vtable_ != nullptr; } bool operator!() const { return vtable_ == nullptr; } - R operator()(Args&&... args) + R operator()(Args... args) { if (vtable_ == nullptr) throw std::bad_function_call(); const TaskVtable* vtable = vtable_; vtable_ = nullptr; - return vtable->call(buffer_, std::move(args)...); + // NOTE: std::forward(args)... is correct. + // see C++ [func.wrap.func.inv] for an example + return vtable->call(buffer_, std::forward(args)...); } }; -- 2.20.1