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)
QVector要求元素是可分配的数据类型,这意味着它们
必须提供默认构造函数、复制构造函数和赋值运算符。
他们的附加版本强制执行所有操作,而您的版本如果为 false 并被优化掉,则不会强制执行复制构造。QTypeInfo<T>::isComplex
注意:QTypeInfo<T>::isComplex在编译时解决。
我怀疑这是一个遗留要求,因为 QVector已经存在于 Qt2 中,它可以追溯到1999c++ 标准化之前。
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |