diff options
author | Marc Mutz <marc.mutz@qt.io> | 2023-04-28 15:14:04 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2023-04-29 20:22:39 +0000 |
commit | 5f28d367d999842a42fa0afa0d36d44ff61ea11d (patch) | |
tree | f3384eb7a1273cf5b8d2e222b4458a2ac338896c /src/corelib/kernel/qpointer.h | |
parent | 9b47c62682647a5a3a4119843a180e067952026f (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.h | 10 |
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(); |