aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltyperegistrar/qanystringviewutils_p.h
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-07-04 14:47:06 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-07-06 11:26:17 +0200
commitc0849af7251d0174b083ad2dc024f79bea62a869 (patch)
treedf83113fb9259fa008b037c3b09129ef6a34f613 /src/qmltyperegistrar/qanystringviewutils_p.h
parentb7b63ba92c38a66bedb6f0c009bfbf5801f7b701 (diff)
qmltyperegistrar: Use std::forward for forwarding reference
Change-Id: Iab77242e8a9c705edcbefec10f760e5e5c664884 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/qmltyperegistrar/qanystringviewutils_p.h')
-rw-r--r--src/qmltyperegistrar/qanystringviewutils_p.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/qmltyperegistrar/qanystringviewutils_p.h b/src/qmltyperegistrar/qanystringviewutils_p.h
index a897e40d26..ed5cc0bca7 100644
--- a/src/qmltyperegistrar/qanystringviewutils_p.h
+++ b/src/qmltyperegistrar/qanystringviewutils_p.h
@@ -113,9 +113,19 @@ auto processAsUtf8(StringView string, Handler &&handler)
if constexpr (std::is_same_v<StringView, QByteArray>)
return handler(QByteArrayView(string));
if constexpr (std::is_same_v<StringView, QAnyStringView>) {
- return string.visit([handler](auto view) {
+
+ // Handler is:
+ // * a reference if an lvalue ref is passed
+ // * a value otherwise
+ // We conserve its nature for passing to the lambda below.
+ // This is necessary because we need to decide on the nature of
+ // the lambda capture as part of the syntax (prefix '&' or not).
+ // So we always pass a reference-conserving wrapper as value.
+ struct Wrapper { Handler handler; };
+
+ return string.visit([w = Wrapper { std::forward<Handler>(handler) }](auto view) mutable {
static_assert(!(std::is_same_v<decltype(view), QAnyStringView>));
- return processAsUtf8(std::move(view), std::move(handler));
+ return processAsUtf8(std::move(view), std::forward<Handler>(w.handler));
});
}
Q_UNREACHABLE();