From c6dbae9550e3819a3e1ade1bf06f5d9cb030d561 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. Pick-to: 6.5 Change-Id: If4fbc311677b993488859b2c4e226b94daed71fe Reviewed-by: Fabian Kosmale --- 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 1541defa7b7..28b4e368fe8 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);