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);
我得到了以下相当简单的代码:
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);