Fixed the checked_guard/nil_guard to pass by reference
authorErich Keane <erich.keane@intel.com>
Mon, 3 Aug 2015 18:40:57 +0000 (11:40 -0700)
committerJon A. Cruz <jonc@osg.samsung.com>
Wed, 5 Aug 2015 19:49:24 +0000 (19:49 +0000)
This fix should allow checked_guard to properly pass by
reference rather than pulling everything out to a copy.  This
should ensure that out parameters are possible in the C++ stack,
though still extremely discouraged.

Change-Id: Ide35e9eb7adbdd532f375f341286387a641e8436
Signed-off-by: Erich Keane <erich.keane@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2087
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Jon A. Cruz <jonc@osg.samsung.com>
resource/include/OCUtilities.h

index 65ea6af..87bdf35 100644 (file)
@@ -78,8 +78,11 @@ namespace OC {
             throw OCException(OC::Exception::NIL_GUARD_NULL, OC_STACK_INVALID_PARAM);
         }
 
-        // Note that although parameters are being forwarded, std::bind() will make a single copy:
-        return std::bind(fn, p, std::forward<ParamTs>(params)...)();
+        // Note that the parameters are being passed by reference to std::bind. This is not an
+        // issue, as it is this function's parameters that are being passed by reference.  So,
+        // unless the parameters are being passed by reference to here (or to checked_guard),
+        // they won't be modified.
+        return std::bind(fn, p, std::ref(params)...)();
     }
 
     /* Check for nullptr and forward the result of an OC function call on success; raise