这种类型的初始化称为什么?

时间:2021-05-02 06:19:53

标签: c++ c initialization aggregate-initialization designated-initializer

我在 Vulkan 教程中看到代码:

VkImageMemoryBarrier imageMemoryBarrier = {
 
   .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
   .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
   .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
   .newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
            /* .image and .subresourceRange should identify image subresource accessed */ 
};

如果我只列出了没有成员 '.member_name =' 的枚举,那将是聚合初始化,对吗?但这叫什么?这个类在 .srcAccreasMask 之前还有其他成员,我假设所有其他没有提到的成员都是零初始化的?但是如果我不知道它叫什么,就很难查到它。另外,我记得像这样的东西是一个新的 C 特性,但它在 Visual Studio 中为我用 C++ 编译。这是一个 C++ 特性,对吧?

2 个答案:

答案 0 :(得分:5)

这仍然是聚合初始化,从 C++20 开始支持 designated initializers 的语法。

<块引用>
T object = { .designator = arg1 , .designator { arg2 } ... }; (3) (since C++20)
T object { .designator = arg1 , .designator { arg2 } ... };   (4) (since C++20)

关于初始化程序中未提及的成员:

<块引用>

对于非联合聚合,未提供指定初始值设定项的元素的初始化与上述相同,当初始值设定项子句的数量小于成员数时(提供的默认成员初始值设定项,空列表-否则初始化):

顺便说一句:C++ 中的规则与 C 不同。

<块引用>

注意:乱序指定初始化、嵌套指定初始化、指定初始化器和常规初始化器混合、数组的指定初始化在C编程语言中都是支持的,但在C++中是不允许的。

答案 1 :(得分:2)

<块引用>

另外,我记得像这样的东西是一个新的 C 特性

这并不新鲜。它是在 C99 中添加的。未显式初始化的成员归零。

https://port70.net/%7Ensz/c/c11/n1570.html#6.7.9

@songyuanyao 添加了一个很好的答案,但为了完整起见:它被称为指定初始值设定项。

相关问题