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:预期为";">
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 中指定。— 尾注 ]
相关文章:
- 在C和C++中初始化结构中的数组
- 我们可以用参数化构造函数初始化结构的数组吗?
- 尝试初始化结构内的联合时出错
- 使用其他成员初始化结构的成员?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何在另一个结构中初始化结构数组?
- 如何在构造函数中初始化结构体的动态数组?
- 初始化结构中的联合 - c++
- 尝试初始化结构向量时出现编译错误
- 用于初始化结构的 void 指针强制转换
- 初始化结构的两种方式
- 用预定义的值初始化结构体
- 用memset初始化结构体
- 初始化结构体中的默认值
- 用大括号括起来的初始化列表初始化结构体时出错
- 如何用c++函数初始化结构体
- c++中初始化结构体向量的正确方法
- 初始化结构体的2d数组
- 初始化C/ c++结构体的const成员…依赖于编译器的