summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qpointer.h
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-04-28 15:14:04 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-04-29 20:22:39 +0000
commit5f28d367d999842a42fa0afa0d36d44ff61ea11d (patch)
treef3384eb7a1273cf5b8d2e222b4458a2ac338896c /src/corelib/kernel/qpointer.h
parent9b47c62682647a5a3a4119843a180e067952026f (diff)
Make QPointer<T> constructible from QPointer<X>
QWeakPointer can do the same, so there's no reason to not allow it for QPointer. [ChangeLog][QtCore][QPointer] QPointer<T> can now be (move- and copy-)constructed from QPointer<X>. Fixes: QTBUG-112464 Change-Id: I77cf5d39974bf2b3ec849b4afc33e286e864821e Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Diffstat (limited to 'src/corelib/kernel/qpointer.h')
-rw-r--r--src/corelib/kernel/qpointer.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h
index 2c82441164..ada4445d43 100644
--- a/src/corelib/kernel/qpointer.h
+++ b/src/corelib/kernel/qpointer.h
@@ -18,6 +18,11 @@ class QPointer
{
static_assert(!std::is_pointer<T>::value, "QPointer's template type must not be a pointer type");
+ template <typename X>
+ using if_convertible = std::enable_if_t<std::is_convertible_v<X*, T*>, bool>;
+ template <typename X>
+ friend class QPointer;
+
using QObjectType =
typename std::conditional<std::is_const<T>::value, const QObject, QObject>::type;
QWeakPointer<QObjectType> wp;
@@ -27,6 +32,11 @@ public:
// compiler-generated copy/move ctor/assignment operators are fine!
// compiler-generated dtor is fine!
+ template <typename X, if_convertible<X> = true>
+ QPointer(QPointer<X> &&other) noexcept : wp(std::move(other.wp)) {}
+ template <typename X, if_convertible<X> = true>
+ QPointer(const QPointer<X> &other) noexcept : wp(other.wp) {}
+
#ifdef Q_QDOC
// Stop qdoc from complaining about missing function
~QPointer();