diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 950b26d1a2d..7b55406ac2d 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -917,18 +917,14 @@ public: // using Base::assign; // using Base::compare; - using Base::copyAppend; - template - void copyAppend(It b, It e, QtPrivate::IfIsForwardIterator = true, - QtPrivate::IfIsNotConvertible = true, - QtPrivate::IfIsNotConvertible = true) + void appendIteratorRange(It b, It e, QtPrivate::IfIsForwardIterator = true) { Q_ASSERT(this->isMutable() || b == e); Q_ASSERT(!this->isShared() || b == e); - const qsizetype distance = std::distance(b, e); Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size); + Q_UNUSED(distance); T *iter = this->end(); for (; b != e; ++iter, ++b) { diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 4511e1282a4..85d3b30432a 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -181,22 +181,25 @@ public: d->copyAppend(args.begin(), args.end()); return *this; } - template = true> + template = true> QList(InputIterator i1, InputIterator i2) { - const auto distance = std::distance(i1, i2); - if (distance) { - d = DataPointer(Data::allocate(distance)); - d->copyAppend(i1, i2); + if constexpr (!std::is_convertible_v::iterator_category, std::forward_iterator_tag>) { + std::copy(i1, i2, std::back_inserter(*this)); + } else { + const auto distance = std::distance(i1, i2); + if (distance) { + d = DataPointer(Data::allocate(distance)); + if constexpr (std::is_same_v, iterator> || + std::is_same_v, const_iterator>) { + d->copyAppend(i1, i2); + } else { + d->appendIteratorRange(i1, i2); + } + } } } - template = true> - QList(InputIterator i1, InputIterator i2) - { - std::copy(i1, i2, std::back_inserter(*this)); - } - // This constructor is here for compatibility with QStringList in Qt 5, that has a QStringList(const QString &) constructor template && std::is_convertible_v>> inline explicit QList(const String &str) diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 3dcaba47597..1963df1a0f9 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -1169,7 +1169,7 @@ void tst_QArrayData::arrayOpsExtra() auto copy = cloneArrayDataPointer(dataPointer, dataPointer.size); const size_t distance = std::distance(first, last); - dataPointer->copyAppend(first, last); + dataPointer->appendIteratorRange(first, last); QCOMPARE(size_t(dataPointer.size), originalSize + distance); size_t i = 0; for (; i < originalSize; ++i)