结构的 QVector - 没有合适的默认构造函数可用

QVector of struct - no appropriate default constructor available

我很困惑为什么这不起作用。我一定是误解了一些关于 QVectors 的关键...

我创建了一个 MCVE 来显示问题:

#include <QCoreApplication>
#include <QVector>

struct ChunkRequest
{
    ChunkRequest(int x, int z)
    {
        this->x = x;
        this->z = z;
    }

    int x;
    int z;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QVector<ChunkRequest> requestedChunks;

    requestedChunks.append(ChunkRequest(1, 2));

    return a.exec();
}

编译报错C2512: 'ChunkRequest' : no appropriate default constructor available

我可以用 ChunkRequest req(1, 2); 创建一个 ChunkRequest 变量,但是当我尝试将它附加到我的 QVector 时,错误就会抛出。

我很困惑为什么。

编辑: 阅读您的评论后,我很清楚 QVector 需要一个默认构造函数来确定数组中每个元素的大小。但这并没有回答为什么。

如果一个结构有一定数量的成员并且每个成员在内存中的大小已知(甚至指向动态内存的指针大小已知)那么我不明白为什么 QVector 需要默认构造函数?大小应该在编译时就知道了……对吧?

在 C++ 中,为结构指定任何构造函数(或 class)会指示编译器 而不是 自动提供默认构造函数。这是语言的怪癖。

这成为容器 class 的一个问题,例如 QVector 可以动态调整大小(内部或显式)。当分配新对象来填充 space 它将调用默认构造函数——但如果没有可用的默认构造函数,则会发生 compile-time 错误。

问题可以通过指定默认构造函数来解决,即使它什么都不做,例如:

ChunkRequest() {}

it is clear to me that QVector requires a default constructor in order to determine the size of each element in the array. But this doesn't answer why.

它与它完全无关,构造函数决不能确定对象的大小,它们的成员布局可以。

强制使用默认构造函数的是 QVector 允许设置大小的构造函数和方法。该构造函数将用于初始化所有这些元素。

如果没有默认构造函数,这些值将是未初始化的并且几乎是无用的垃圾数据。

有一个默认的构造函数告诉你 "I can construct meaningful objects of that type without passing any parameters"。

如果您个人不使用任何这些构造函数或方法也没关系,尽管如此,class 实现还是需要它。

至于为什么它也对基本上保留的内存使用构造,这可能本身就值得一个问题,因为至少对我来说根本没有充分的理由这样做,这似乎是一个潜在的开销。