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

Zeb*_*ish 3 c c++ initialization designated-initializer aggregate-initialization

我在 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 */ 
};
Run Code Online (Sandbox Code Playgroud)

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

son*_*yao 5

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

T object = { .designator = arg1 , .designator { arg2 } ... }; (3) (since C++20)
T object { .designator = arg1 , .designator { arg2 } ... };   (4) (since C++20)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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