在矢量大括号初始化中将 C 数组传递给结构初始值设定项

Passing a C array to a struct initializer in a vector brace initialization

本文关键字:结构 数组 初始化      更新时间:2023-10-16

首先,我看到了这个问题。

我很好奇为什么以下内容不起作用:

float vcolor[4]{color.getX(),color.getY(),color.getZ(),1.0f};
float v1[3]{from.getX(),from.getY(),from.getZ()};
float v2[3]{to.getX(),to.getY(),to.getZ()};
std::vector<Vertex> v={{v1,vcolor},{v2,vcolor}};

没有用于初始化的匹配构造函数 'std::vector'

但是直接传递元素可以正常工作(如另一个问题中所述(:

std::vector<Vertex> v={
    {{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}},
    {{to.getX(),to.getY(),to.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}}};

前者不应该也有可能吗?

这里有一个简单的解释。您可以使用聚合初始化语法初始化数组,如float arr[4] = { 1.f, 2.f, 3.f, 4.f }。这就是Vertex v = { {1.f, 2.f, 3.f}, {1.f, 2.f, 3.f, 4.f} }工作的原因。你不能做的是从另一个数组复制初始化一个数组。所以

float arr[4] = { 1.f, 2.f, 3.f, 4.f };
float brr[4] = arr;

不行。所以,最终,在你的问题中,第一种形式不起作用。

让我们更详细地看看你在这里尝试做什么:

std::vector<Vertex> v={
    {{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}},
    {{to.getX(),to.getY(),to.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}}};

您尝试使用两个元素初始化 Vector,这两个元素的初始化方式为

{{from.getX(),from.getY(),from.getZ()},
    {color.getX(),color.getY(),color.getZ(),1.0f}}

{{to.getX(),to.getY(),to.getZ()},
    {color.getX(),color.getY(),color.getZ(),1.0f}}

这些又是初始值设定项列表,C++尝试将其转换为顶点。Sinze 它们包含两个元素,它们本身是包含 3(4( 浮点数的初始值设定项列表。(至少我假设你的getX/Y/Z()返回浮点数(,一切都很好,它们用于初始化每个顶点内的数组。这在某种程度上等同于调用

Vertex{{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}};
float position[3]{from.getX(),from.getY(),from.getZ()};
float color[4]{color.getX(),color.getY(),color.getZ(),1.0f};

现在让我们看看你的第二个案例:

std::vector<Vertex> v={{v1,vcolor},{v2,vcolor}};

同样,每个 containig 初始值设定项列表都"映射"到一个顶点,给出如下调用:

Vertex{v1,vcolor}

但是 v1 和 vcolor 不是初始值设定项列表,它们只是一个指向浮点数的指针(float*(

就像你不能做的那样

float v3[3]{v1};

或更明显

float* f = new float;
float v[3]{f};

无法从float*初始化数组

您可以尝试使用 std::arrays 并使用其基于迭代器的构造。或者你可以尝试为顶点编写适当的构造函数。或者,您可以将初始值设定项列表存储为初始值设定项列表,直到实际形成顶点。无论哪种方式,分多个步骤构建顶点都需要做更多的工作。