Reject const T*-convertible types in QCommonArrayOps::copyAppend<It>

In many cases (e.g. relocatable and pod), generic version is more
expensive. Let's not expect array data ops to only get QADP iterators
as input. Instead, reject generic version for any const T* -convertible
iterator and force compiler to select copyAppend(const T *b, const T *e)
as a suitable overload

Change-Id: I47a09d35a8ff15322381c2aa28258bfc7deebbad
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Andrei Golubev 2020-10-28 12:33:35 +01:00
parent 89391da882
commit a5592293f8
2 changed files with 5 additions and 2 deletions

View File

@ -1267,8 +1267,8 @@ public:
template<typename It>
void copyAppend(It b, It e, QtPrivate::IfIsForwardIterator<It> = true,
QtPrivate::IfIsNotSame<std::decay_t<It>, iterator> = true,
QtPrivate::IfIsNotSame<std::decay_t<It>, const_iterator> = true)
QtPrivate::IfIsNotConvertible<It, const T *> = true,
QtPrivate::IfIsNotConvertible<It, const T *> = true)
{
Q_ASSERT(this->isMutable() || b == e);
Q_ASSERT(!this->isShared() || b == e);

View File

@ -147,6 +147,9 @@ using IfAssociativeIteratorHasFirstAndSecond =
template <typename T, typename U>
using IfIsNotSame =
typename std::enable_if<!std::is_same<T, U>::value, bool>::type;
template<typename T, typename U>
using IfIsNotConvertible = typename std::enable_if<!std::is_convertible<T, U>::value, bool>::type;
} // namespace QtPrivate
QT_END_NAMESPACE