莢struct
一個結構可以是零初始化在C++ 11如下:零重新初始化在C++
SomeStruct s{};
然而,有什麼事,如果我已經有結構和我的一個實例,我做想重新初始化爲零?以下似乎工作:
s = {};
有人可以指出相關的標準嗎?我認爲這是發生了什麼:
- 一個新的零初始化實例被創建。
- 將新實例分配給現有實例,調用隱式賦值運算符。
莢struct
一個結構可以是零初始化在C++ 11如下:零重新初始化在C++
SomeStruct s{};
然而,有什麼事,如果我已經有結構和我的一個實例,我做想重新初始化爲零?以下似乎工作:
s = {};
有人可以指出相關的標準嗎?我認爲這是發生了什麼:
你所尋找的是在[expr.ass]
一個支撐,初始化列表可能對
- 分配的右手邊出現一個標量,在這種情況下,初始化程序列表最多隻有一個元素。 的含義 ,其中T是表達式x的標量類型,是
x=T{v}
的標量類型。x={}
的含義是x=T{}
。- 對類類型的對象的賦值,在這種情況下,初始化程序列表作爲參數傳遞給由重載決策選擇的賦值運算符函數(13.5.3,13.3)。
所以你的猜測是正確的。編譯器可以將事情優化掉,但您可以將其視爲創建一個零初始化的臨時表,並將其傳遞給operator=
。
s = {};
是不安全的。
問題是你希望它變成s = SomeStruct{};
。但是,如果s
對operator=
then that may be preferred by overload resolution有另一個過載。
所以這是一個反模式,真的。至於其他的線程上的建議,你最好寫一個函數,例如:
template<typename T> void reset(T &t) { t = T{}; }
我想你也可以寫s = decltype(s){};
,只要s
不是一個參考。
爲什麼不明確使用你的'hoped'來解析。 's = SomeStruct {}'?這似乎比函數調用reset()更清晰。 –
@LokiAstari很好,我們可能遠離's'的聲明,因此檢查這實際上做的是正確的事情並不那麼容易。如果我們不小心把's = SomeOtherStruct {};'然後其他奇怪的影響可能會發生。我嘗試使用最小化錯誤可能性的代碼模式(特別是非顯而易見的錯誤)。我想'decltype'版本是最好的。我發現那不美觀,但也許我需要更新我的美學 –
我對「SomeOtherStruct {}」有一些看法。那麼它對「decltype」更有意義,但仍然看起來很醜陋(而美學很重要)。 –
我不知道標準,但是 - 這可能會優化一些。事實上,如果你不使用0,那麼可能_all_被優化掉。 – einpoklum
在那裏有一個明確的規則,允許分配的右邊的大括號。你的假設是非常正確的。 – chris
沒有「重新初始化」這樣的事情。你初始化一次。就一次。你在做什麼是分配,在微妙和不那麼微妙的方式是非常不同的。 –