diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-11-18 23:35:39 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-11-24 15:18:52 +0200 |
commit | 0eacde623bb08504c71e18713188a7cfaf4e8e80 (patch) | |
tree | b6b2f9a499bc0cec79827958b4a99a6f1da2752d | |
parent | 796210ecea8270cd870b0ef11833a26bfcf766cd (diff) |
libcamera: object: Avoid argument copies in invokeMethod()
Template argument deduction results in the lvalue and lvalue reference
arguments to the invokeMethod() function causing deduction of the Args
template type to a non-reference type. This results in the argument
being passed by value and copied.
Fix this by using a cv-unqualified rvalue reference parameter type. The
type is then deduced to an lvalue reference when the argument is an
lvalue or lvalue reference, due to a combination of the special template
argument deduction rule for rvalue reference parameter types:
If P is an rvalue reference to a cv-unqualified template parameter
(so-called forwarding reference), and the corresponding function call
argument is an lvalue, the type lvalue reference to A is used in place
of A for deduction.
(https://en.cppreference.com/w/cpp/language/template_argument_deduction)
and the reference collapsing rule
(https://en.cppreference.com/w/cpp/language/reference#Reference_collapsing).
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r-- | include/libcamera/base/object.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/libcamera/base/object.h b/include/libcamera/base/object.h index 25dcbc04..eef1a2c9 100644 --- a/include/libcamera/base/object.h +++ b/include/libcamera/base/object.h @@ -34,7 +34,7 @@ public: template<typename T, typename R, typename... FuncArgs, typename... Args, typename std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr> R invokeMethod(R (T::*func)(FuncArgs...), ConnectionType type, - Args... args) + Args&&... args) { T *obj = static_cast<T *>(this); auto *method = new BoundMethodMember<T, R, FuncArgs...>(obj, this, func, type); |