簡體   English   中英

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 ++?

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

}

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

請參見c ++標准的[類]部分(此處引自標准草案n4527,2015)。

特別是有關標准版式類型的注釋:

[注意:標准布局類對於與其他編程語言編寫的代碼進行通信很有用。 其布局在9.2中指定。 —尾注]

第一個版本“不起作用”,因為它在語法上是荒謬的。 C ++語法中沒有分支可以解析您的第一個變體。 編譯器根本不知道您要按該字符序列說什么。 因此,真正的問題在您身上:您嘗試通過第一個版本實現什么?

第二個版本有效,因為它是有效的C ++代碼。 賦值右側的{ sizeof(WNDCLASSEX) }被解釋為創建/初始化與windowClass.cbSize相同類型的臨時對象。 然后windowClass.cbSize臨時對象分配給windowClass.cbSize 即,由於windowClass.cbSize具有UINT類型,因此您的第二個版本被解釋為

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

在實踐中與

windowClass.cbSize = sizeof(WNDCLASSEX);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM