summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSona Kurazyan <sona.kurazyan@qt.io>2020-10-30 11:21:01 +0100
committerSona Kurazyan <sona.kurazyan@qt.io>2020-10-30 17:19:26 +0100
commitff0ba7e2d7b91fd5809cb314935a1ca1a436f6c9 (patch)
treeb1a9ca252e2953c23fdd62645e231ef8f92b4ac9 /src
parent48a13327c663a9e1409cc98936190f3d1565fcc2 (diff)
Forbid implicit conversions between QFuture and other types
- Remove the casting operator of QFuture<T> to T. It calls QFuture::result(), which may lead to undefined behavior if the user has moved the results from QFuture via QFuture::takeResult() before trying to do the conversion. - Disable implicit conversion of QFuture<T> to QFuture<void>, by making the constructor explicit. If the users really intend to do the conversion, they should do it explicitly. [ChangeLog][Source-Incompatible Changes][QFuture] Implicit conversions of QFuture<T> to T and to QFuture<void> have been disabled. Use QFuture::result() or QFuture::takeResult() where you need to convert QFuture<T> to T. Use the explicit QFuture<void>(const QFuture<T> &) constructor to convert QFuture<T> to QFuture<void>. Change-Id: I153d4137d36365b1611ac934fb3ac2eb667fdd6c Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/thread/qfuture.h9
-rw-r--r--src/corelib/thread/qfuture.qdoc13
2 files changed, 1 insertions, 21 deletions
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h
index c5966f7893..44c5331261 100644
--- a/src/corelib/thread/qfuture.h
+++ b/src/corelib/thread/qfuture.h
@@ -81,7 +81,7 @@ public:
}
template<typename U, typename V = T, typename = QtPrivate::EnableForVoid<V>>
- QFuture(const QFuture<U> &other) : d(other.d)
+ explicit QFuture(const QFuture<U> &other) : d(other.d)
{
}
@@ -96,9 +96,6 @@ public:
~QFuture() { }
QFuture(const QFuture<T> &) { }
QFuture<T> & operator=(const QFuture<T> &) { }
-
- // This is required to allow QDoc to find the declaration of operator T().
- operator T() const;
#endif
void cancel() { d.cancel(); }
@@ -150,10 +147,6 @@ QT_WARNING_POP
template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
bool isResultReadyAt(int resultIndex) const { return d.isResultReadyAt(resultIndex); }
- // operator T()
- template<typename U = T>
- operator typename std::enable_if_t<!std::is_same_v<U, void>, U>() const { return result(); }
-
template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
QList<T> results() const { return d.results(); }
diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc
index 59f80da4af..82b7657016 100644
--- a/src/corelib/thread/qfuture.qdoc
+++ b/src/corelib/thread/qfuture.qdoc
@@ -433,19 +433,6 @@
\sa resultAt(), resultCount(), takeResult()
*/
-/*! \fn template <typename T> QFuture<T>::operator T() const
-
- Returns the first result in the future. If the result is not immediately
- available, this function will block and wait for the result to become
- available. This is a convenience method for calling result() or
- resultAt(0).
-
- \note Calling this function leads to undefined behavior if isValid()
- returns \c false for this QFuture.
-
- \sa result(), resultAt(), results(), takeResult(), isValid()
-*/
-
/*! \fn template <typename T> QList<T> QFuture<T>::results() const
Returns all results from the future. If the results are not immediately available,