diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index da3a5926ea..f3e78b4cdb 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -310,8 +310,7 @@ public: return data()[i]; } const_reference operator[](qsizetype i) const noexcept { return at(i); } - void append(parameter_type t) - { append(const_iterator(std::addressof(t)), const_iterator(std::addressof(t)) + 1); } + void append(parameter_type t) { emplaceBack(t); } void append(const_iterator i1, const_iterator i2); void append(rvalue_ref t) { emplaceBack(std::move(t)); } void append(const QList &l) @@ -324,8 +323,8 @@ public: void prepend(rvalue_ref t) { emplaceFront(std::move(t)); } void prepend(parameter_type t) { emplaceFront(t); } - template - reference emplaceBack(Args&&... args) { return *emplace(count(), std::forward(args)...); } + template + inline reference emplaceBack(Args &&... args); template inline reference emplaceFront(Args&&... args); @@ -766,6 +765,21 @@ QList::emplace(qsizetype i, Args&&... args) return d.begin() + i; } +template +template +inline typename QList::reference QList::emplaceBack(Args &&... args) +{ + if (d->needsDetach() || !d.freeSpaceAtEnd()) { + DataPointer detached(DataPointer::allocateGrow(d, 1, QArrayData::AllocateAtEnd)); + detached->copyAppend(constBegin(), constEnd()); + detached->emplace(detached.end(), std::forward(args)...); + d.swap(detached); + } else { + d->emplace(d.end(), std::forward(args)...); + } + return *(d.end() - 1); +} + template typename QList::iterator QList::erase(const_iterator abegin, const_iterator aend) { diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index d1e321f4db..7f07b45473 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -875,7 +875,7 @@ void tst_QList::appendList() const v6 << (QList() << 3 << 4); QCOMPARE(v6, expectedFour); QCOMPARE(v6.at(0).copies, 2); - QCOMPARE(v6.at(0).moves, 2); + QCOMPARE(v6.at(0).moves, 1); // += QList v7;