diff options
-rw-r--r-- | src/corelib/tools/qarraydataops.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 9a2f43cbb1..173e3cac2e 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -911,10 +911,20 @@ public: Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size); Q_UNUSED(distance); - T *iter = this->end(); - for (; b != e; ++iter, ++b) { - new (iter) T(*b); - ++this->size; +#if __cplusplus >= 202002L + if constexpr ( + std::is_convertible_v< + typename std::iterator_traits<It>::iterator_category, + std::contiguous_iterator_tag>) { + this->copyAppend(std::to_address(b), std::to_address(e)); + } else +#endif + { + T *iter = this->end(); + for (; b != e; ++iter, ++b) { + new (iter) T(*b); + ++this->size; + } } } |