From 9d5a03233f4b9495b8698ed8e4bad3d246cbbf13 Mon Sep 17 00:00:00 2001
From: scott-linder <scott.b.linder@wmich.edu>
Date: Mon, 30 Dec 2013 19:33:17 -0500
Subject: Added std::forward in order to respect move semantics in some
 methods.

Previously, calls to the methods assign<C>(...), emit<E>(...), and add<S>(...)
would fail if constructor arguments relied upon move semantics.
---
 entityx/Entity.h | 4 ++--
 entityx/Event.h  | 2 +-
 entityx/System.h | 3 ++-
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/entityx/Entity.h b/entityx/Entity.h
index 9577375..1758c3f 100644
--- a/entityx/Entity.h
+++ b/entityx/Entity.h
@@ -474,7 +474,7 @@ class EntityManager : entityx::help::NonCopyable, public enable_shared_from_this
    */
   template <typename C, typename ... Args>
   ptr<C> assign(Entity::Id entity, Args && ... args) {
-    return assign<C>(entity, ptr<C>(new C(args ...)));
+    return assign<C>(entity, ptr<C>(new C(std::forward<Args>(args) ...)));
   }
 
   /**
@@ -630,7 +630,7 @@ ptr<C> Entity::assign(ptr<C> component) {
 template <typename C, typename ... Args>
 ptr<C> Entity::assign(Args && ... args) {
   assert(valid());
-  return manager_.lock()->assign<C>(id_, args ...);
+  return manager_.lock()->assign<C>(id_, std::forward<Args>(args) ...);
 }
 
 template <typename C>
diff --git a/entityx/Event.h b/entityx/Event.h
index e60e7d7..dac1bb4 100644
--- a/entityx/Event.h
+++ b/entityx/Event.h
@@ -160,7 +160,7 @@ class EventManager : entityx::help::NonCopyable {
    */
   template <typename E, typename ... Args>
   void emit(Args && ... args) {
-    E event(args ...);
+    E event(std::forward<Args>(args) ...);
     auto sig = signal_for(E::family());
     sig->emit(static_cast<BaseEvent*>(&event));
   }
diff --git a/entityx/System.h b/entityx/System.h
index 132b8b9..9c0b2ec 100644
--- a/entityx/System.h
+++ b/entityx/System.h
@@ -12,6 +12,7 @@
 
 
 #include <unordered_map>
+#include <utility>
 #include <stdint.h>
 #include <cassert>
 #include "entityx/config.h"
@@ -108,7 +109,7 @@ class SystemManager : entityx::help::NonCopyable, public enable_shared_from_this
    */
   template <typename S, typename ... Args>
   ptr<S> add(Args && ... args) {
-    ptr<S> s(new S(args ...));
+    ptr<S> s(new S(std::forward<Args>(args) ...));
     add(s);
     return s;
   }
-- 
cgit v1.2.3