From 0eacde623bb08504c71e18713188a7cfaf4e8e80 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 18 Nov 2021 23:35:39 +0200 Subject: 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 Reviewed-by: Umang Jain Reviewed-by: Kieran Bingham --- include/libcamera/base/object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include') 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::value> * = nullptr> R invokeMethod(R (T::*func)(FuncArgs...), ConnectionType type, - Args... args) + Args&&... args) { T *obj = static_cast(this); auto *method = new BoundMethodMember(obj, this, func, type); -- cgit v1.2.1