C++ 数组嵌套结构初始化

C++ 数组嵌套结构初始化,c++,struct,nested,initialization,C++,Struct,Nested,Initialization,还有其他关于嵌套结构数组初始化的帖子。然而,遵循Stackoverflow中其他地方给出的建议和到的链接并不能帮助我解决问题 我的背景是,我正在初始化Vulkan图形API中的许多嵌套结构 但是,在查看其他代码进行解释时,我遇到了以下“C”初始化(请注意,我正在添加定义的结构和有问题的代码) Vulkan类型定义 typedef union VkClearColorValue { float float32[4]; int32_t int32[4];

还有其他关于嵌套结构数组初始化的帖子。然而,遵循Stackoverflow中其他地方给出的建议和到的链接并不能帮助我解决问题

我的背景是,我正在初始化Vulkan图形API中的许多嵌套结构

但是,在查看其他代码进行解释时,我遇到了以下“C”初始化(请注意,我正在添加定义的结构和有问题的代码)

Vulkan类型定义

typedef union VkClearColorValue {
    float       float32[4];
    int32_t     int32[4];
    uint32_t    uint32[4];
} VkClearColorValue;

typedef struct VkClearDepthStencilValue {
    float       depth;
    uint32_t    stencil;
} VkClearDepthStencilValue;

typedef union VkClearValue {
    VkClearColorValue           color;
    VkClearDepthStencilValue    depthStencil;
} VkClearValue;
有问题的“C”代码

    const VkClearValue clear_values[2] = {
            [0] = {.color.float32 = {0.2f, 0.2f, 0.2f, 0.2f}},
            [1] = {.depthStencil = {demo->depthStencil, 0}},
    };
“C”表示在C99和最新的gcc编译器中是合法的

但是,当我将这个应用到C++时,我会得到错误。 回到聚合初始化规则,“C”表示在C++17中应该是合法的。但是,在编译时,我得到了如下错误:error:在“.”标记之前应该有主表达式


显然,我的假设是错误的。因此,任何人都可以提供如何在C++ 17中合法化的指导。

< P>这不是C++中的一种有效形式,即使它是在C中。事实上,有一点值得注意:

注释:在指定的初始化中,嵌套指定初始化、指定初始化器和规则初始化器的混合以及数组的指定初始化都是用C语言编程的,但在C++中不允许。

struct A { int x, y; };
struct B { struct A a; };
struct A a = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order)
int arr[3] = {[1] = 5};        // valid C, invalid C++ (array)
struct B b = {.a.x = 0};       // valid C, invalid C++ (nested)
struct A a = {.x = 1, 2};      // valid C, invalid C++ (mixed)
回到聚合初始化规则,“C”表示在C++17中应该是合法的

你的假设是错误的,因为你的结论是正确的。自从第一个标准版本以来,C++已经进行了聚合初始化,但是它不支持在C99中添加的所有初始化。例如,C++17中根本没有指定的初始化器

因此,琐碎的联合只能在第一个成员处于活动状态时进行初始化,如C89。要激活另一个成员,必须在初始化后进行分配。要对const对象执行此操作,可以使用函数


C++20添加了指定的初始化器,但即使这样,也只允许使用C的子集。以下内容在C++20中格式良好:

const VkClearValue clear_values[2] = {
    {.color {.float32 = {0.2f, 0.2f, 0.2f, 0.2f}}},
    {.depthStencil = {42, 0}},
};