diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-07-04 14:47:06 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-07-06 11:26:17 +0200 |
commit | c0849af7251d0174b083ad2dc024f79bea62a869 (patch) | |
tree | df83113fb9259fa008b037c3b09129ef6a34f613 /src/qmltyperegistrar/qanystringviewutils_p.h | |
parent | b7b63ba92c38a66bedb6f0c009bfbf5801f7b701 (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.h | 14 |
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(); |