summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-11-18 23:35:39 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-11-24 15:18:52 +0200
commit0eacde623bb08504c71e18713188a7cfaf4e8e80 (patch)
treeb6b2f9a499bc0cec79827958b4a99a6f1da2752d
parent796210ecea8270cd870b0ef11833a26bfcf766cd (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.h2
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);