C++14 结构体上的统一初始化

C++14 uniform initialization on structs

本文关键字:初始化 结构体 C++14      更新时间:2023-10-16

我有以下相当简单的代码:

WNDCLASSEX windowClass = {0};
windowClass.cbSize { sizeof(WNDCLASSEX) };

我想知道为什么上面的代码不起作用,而下面的代码可以:

WNDCLASSEX windowClass = {0};
windowClass.cbSize = { sizeof(WNDCLASSEX) };

Visual Studio 15 2017给了我这两个错误:

1:预期为";">

2:错误 C2064:术语的计算结果不为 1 个参数的函数

不能多次初始化同一变量 (windowClass(,也不能在单独的初始化语句中初始化成员变量。

在您的情况下,由于 cbSize 是第一项

WNDCLASSEX windowsClass { sizeof(WNDCLASSEX) };

这会将 cbSize 设置为 sizeof(WNDCLASSEX(,将结构的其余部分设置为 0。

第一个版本"不起作用",因为它在语法上是荒谬的。C++语法中没有分支能够解析您的第一个变体。编译器根本不知道你想通过这个字符序列说什么。所以,问题真的是你:你试图通过第一个版本实现什么?

第二个版本有效,因为它是有效的C++代码。赋值右侧的{ sizeof(WNDCLASSEX) }被解释为创建/初始化与windowClass.cbSize相同类型的临时对象。然后将该临时对象分配给windowClass.cbSize。也就是说,由于windowClass.cbSize具有UINT类型,因此您的第二个版本被解释为

windowClass.cbSize = UINT{ sizeof(WNDCLASSEX) };

在实践中具有与

windowClass.cbSize = sizeof(WNDCLASSEX);

或者为什么不完全使用 c++?

struct WndClasssEx : WNDCLASSEX
{
WndClassex() : WNDCLASSEX { sizeof(WNDCLASSEX) } {}
}
auto mywndclass = WndClasssEx();
DoSomethingWindowsy(&mywndclass);

参见 c++ 标准,第 [类] 部分(此处引用自标准草案 n4527,2015(。

特别是关于标准布局类型的说明:

[ 注意:标准布局类对于与用其他编程语言编写的代码进行通信非常有用。 它们的布局在 9.2 中指定。— 尾注 ]