QVector :: append()显式复制的原因是什么?

Gri*_*ief 9 c++ qt

template <typename T>
void QVector<T>::append(const T &t)
{
    const T copy(t);
    const bool isTooSmall = uint(d->size + 1) > d->alloc;
    if (!isDetached() || isTooSmall) {
        QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow :     QArrayData::Default);
        reallocData(d->size, isTooSmall ? d->size + 1 : d->alloc, opt);
    }
    if (QTypeInfo<T>::isComplex)
        new (d->end()) T(copy);
    else
        *d->end() = copy;
    ++d->size;
}
Run Code Online (Sandbox Code Playgroud)

是什么原因const T copy(t)而不是t通过值传递给方法?这和之间有什么区别:

template <typename T>
void QVector<T>::append(const T t)
{
    const bool isTooSmall = uint(d->size + 1) > d->alloc;
    if (!isDetached() || isTooSmall) {
        QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow :     QArrayData::Default);
        reallocData(d->size, isTooSmall ? d->size + 1 : d->alloc, opt);
    }
    if (QTypeInfo<T>::isComplex)
        new (d->end()) T(t);
    else
        *d->end() = t;
    ++d->size;
}
Run Code Online (Sandbox Code Playgroud)

UmN*_*obe 4

QVector要求元素是可分配的数据类型,这意味着它们

必须提供默认构造函数、复制构造函数和赋值运算符。

他们的附加版本强制执行所有操作,而您的版本如果为 false 并被优化掉,则不会强制执行复制构造。QTypeInfo<T>::isComplex

注意:QTypeInfo<T>::isComplex在编译时解决。

我怀疑这是一个遗留要求,因为 QVector已经存在于 Qt2 中,它可以追溯到1999c++ 标准化之前。