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

时间:2017-07-15 21:30:59

标签: c++ c++11 visual-c++ c++14 uniform-initialization

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

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize { sizeof(WNDCLASSEX) };

我想知道为什么上面的代码不起作用,下面的代码确实如此:

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize = { sizeof(WNDCLASSEX) };

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

  

1:期待&#39 ;;'

     

2:错误C2064:术语不评估为采用1个参数的函数

3 个答案:

答案 0 :(得分:3)

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

在你的情况下,因为cbSize是第一个项目

WNDCLASSEX windowsClass { sizeof(WNDCLASSEX) };

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

答案 1 :(得分:0)

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

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

}

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

参见c ++标准,[Class]部分(引自标准草案n4527,2015)。

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

  

[注意:标准布局类对于与使用其他编程语言编写的代码进行通信非常有用。   它们的布局在9.2中规定。 - 结束说明]

答案 2 :(得分:0)

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

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

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

实际上与

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