From aec4a7d1fd9a7d216f10e13367c22e9555b87382 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 1 Mar 2023 14:24:22 +0100 Subject: [PATCH] qobjectdefs.h: properly disable rvalue qReturnArg() template qReturnArg(T&&) is an unconstrained perfect forwarder, and will "win" for everything for which `T&` is not an equal match. e.g. a volatile T. Restrict the deleted overload to actual rvalues. We don't need to use `const volatile T&&`, because rvalues never bind to `T&`, we just need to get off using a universal reference, and adding const does that. As a drive-by, change the deleted overload's return type to void, to mimic std::as_const(), the prototype for rvalue-deleted function overloads. Change-Id: If4fbc311677b993488859b2c4e226b94daed71fe Reviewed-by: Fabian Kosmale (cherry picked from commit c6dbae9550e3819a3e1ade1bf06f5d9cb030d561) Reviewed-by: Thiago Macieira --- src/corelib/kernel/qobjectdefs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index e136fb61f62..5217b0d7e32 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -216,7 +216,7 @@ template inline auto invokeMethodHelper(QMetaMethodReturnArgu } } // namespace QtPrivate -template inline QMetaMethodReturnArgument qReturnArg(T &&) = delete; +template void qReturnArg(const T &&) = delete; template inline QMetaMethodReturnArgument qReturnArg(T &data) { return QtPrivate::Invoke::returnArgument(nullptr, data);