QScopeGuard: Fix build failures with qScopeGuard()
Partially reverts 4f077b7e5f
.
Can't overload with forwarding references and lvalue references. Use a single
forwarding reference overload, but take care of not trying to create a
QScopeGuard of reference type and forward instead of moving.
Add tests to ensure calling with both lvalues and rvalues is possible.
Change-Id: Ia034afe0a8feb08246c2c7c154a85cae37421c98
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
beede51bca
commit
89f443dfbc
@ -43,6 +43,8 @@
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
@ -98,18 +100,9 @@ template <typename F>
|
||||
#if __has_cpp_attribute(nodiscard)
|
||||
Q_REQUIRED_RESULT
|
||||
#endif
|
||||
QScopeGuard<F> qScopeGuard(F &&f)
|
||||
QScopeGuard<typename std::decay<F>::type> qScopeGuard(F &&f)
|
||||
{
|
||||
return QScopeGuard<F>(std::move(f));
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
#if __has_cpp_attribute(nodiscard)
|
||||
Q_REQUIRED_RESULT
|
||||
#endif
|
||||
QScopeGuard<F> qScopeGuard(const F &f)
|
||||
{
|
||||
return QScopeGuard<F>(f);
|
||||
return QScopeGuard<typename std::decay<F>::type>(std::forward<F>(f));
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -112,12 +112,19 @@ void tst_QScopeGuard::constructionFromLvalue()
|
||||
{
|
||||
#ifdef __cpp_deduction_guides
|
||||
Callable::resetCounts();
|
||||
Callable callable;
|
||||
{
|
||||
Callable callable;
|
||||
QScopeGuard guard(callable);
|
||||
}
|
||||
QCOMPARE(Callable::copied, 1);
|
||||
QCOMPARE(Callable::moved, 0);
|
||||
Callable::resetCounts();
|
||||
{
|
||||
Callable callable;
|
||||
auto guard = qScopeGuard(callable);
|
||||
}
|
||||
QCOMPARE(Callable::copied, 1);
|
||||
QCOMPARE(Callable::moved, 0);
|
||||
#else
|
||||
QSKIP("This test requires C++17 Class Template Argument Deduction support enabled in the compiler.");
|
||||
#endif
|
||||
@ -133,6 +140,13 @@ void tst_QScopeGuard::constructionFromRvalue()
|
||||
}
|
||||
QCOMPARE(Callable::copied, 0);
|
||||
QCOMPARE(Callable::moved, 1);
|
||||
Callable::resetCounts();
|
||||
{
|
||||
Callable callable;
|
||||
auto guard = qScopeGuard(std::move(callable));
|
||||
}
|
||||
QCOMPARE(Callable::copied, 0);
|
||||
QCOMPARE(Callable::moved, 1);
|
||||
#else
|
||||
QSKIP("This test requires C++17 Class Template Argument Deduction support enabled in the compiler.");
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user