[英]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.