C++14 结构统一初始化

C++14 uniform initialization on structs

我得到了以下相当简单的代码:

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize { sizeof(WNDCLASSEX) };

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

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize = { sizeof(WNDCLASSEX) };

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

1: expected a ';'

2: error C2064: term does not evaluate to a function taking 1 arguments

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

在你的例子中,因为 cbSize 是第一项

WNDCLASSEX windowsClass { sizeof(WNDCLASSEX) };

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

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

struct WndClasssEx : WNDCLASSEX
{
    WndClassex() : WNDCLASSEX { sizeof(WNDCLASSEX) } {}

}

auto mywndclass = WndClasssEx();
DoSomethingWindowsy(&mywndclass);

参见 c++ 标准,第 [Class] 节(此处引用标准草案 n4527,2015)。

特别是关于标准布局类型的注释:

[ Note: Standard-layout classes are useful for communicating with code written in other programming languages. Their layout is specified in 9.2. — end note ]

第一个版本"does not work"因为它在语法上毫无意义。 C++ 语法中没有能够解析您的第一个变体的分支。编译器根本不知道您要通过该字符序列说什么。所以,真正的问题是你:你试图通过第一个版本实现什么?

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

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

实际上与

具有相同的效果
windowClass.cbSize = sizeof(WNDCLASSEX);