我可以看出类被视为复杂对象,需要调用默认构造函数:
void QVector<T>::defaultConstruct(T *from, T *to)
{
if (QTypeInfo<T>::isComplex) {
while (from != to) {
new (from++) T();
}
...
}
但是为什么需要在QVector的“隐藏”区域构建对象并不清楚。我的意思是这些对象根本无法访问,那么为什么不仅保留内存而不是真正的对象创建呢?
作为一个额外的问题,我想问一下,如果我想要一个非默认构造对象的数组,我是否可以安全地用 QVector<Wrapper<T>
替换 QVector<T>
?其中Wrapper
类似于以下内容:
class Wrapper {
public:
union {
T object;
bool hack;
};
Wrapper() {}
Wrapper(const T &t) : object { t } {}
Wrapper(const Wrapper &t) : object { t.object } {}
Wrapper &operator=(const Wrapper &value) {
object = value.object;
return *this;
}
~Wrapper() {}
};
QVector(int)
е’Ңresize(int)
з”ЁдәҺе®һйҷ…еңЁеҗ‘йҮҸдёӯзҡ„е…ғзҙ гҖӮ - ascheplerstd::unique_ptr
相比这个hack有任何优势,而且磨损内存的巨大缺点会抵消QVector
本身的优势。此外,请不要忘记,std::vector
没有默认构造函数的要求。 - GriefT QVector::value(int i) const
也需要一个默认构造函数,因为如果索引超出范围,你会得到一个默认值。 - ymoreau