2015-12-23 71 views
20

struct一個結構可以是零初始化在C++ 11如下:零重新初始化在C++

SomeStruct s{}; 

然而,有什麼事,如果我已經有結構和我的一個實例,我做想重新初始化爲零?以下似乎工作:

s = {}; 

有人可以指出相關的標準嗎?我認爲這是發生了什麼:

  1. 一個新的零初始化實例被創建。
  2. 將新實例分配給現有實例,調用隱式賦值運算符。
+1

我不知道標準,但是 - 這可能會優化一些。事實上,如果你不使用0,那麼可能_all_被優化掉。 – einpoklum

+1

在那裏有一個明確的規則,允許分配的右邊的大括號。你的假設是非常正確的。 – chris

+0

沒有「重新初始化」這樣的事情。你初始化一次。就一次。你在做什麼是分配,在微妙和不那麼微妙的方式是非常不同的。 –

回答

18

你所尋找的是在[expr.ass]

一個支撐,初始化列表可能對

  • 分配的右手邊出現一個標量,在這種情況下,初始化程序列表最多隻有一個元素。 的含義 ,其中T是表達式x的標量類型,是x=T{v}的標量類型。 x={}的含義是x=T{}
  • 對類類型的對象的賦值,在這種情況下,初始化程序列表作爲參數傳遞給由重載決策選擇的賦值運算符函數(13.5.3,13.3)。

所以你的猜測是正確的。編譯器可以將事情優化掉,但您可以將其視爲創建一個零初始化的臨時表,並將其傳遞給operator=

12

s = {};是不安全的。

問題是你希望它變成s = SomeStruct{};。但是,如果soperator=then that may be preferred by overload resolution有另一個過載。

所以這是一個反模式,真的。至於其他的線程上的建議,你最好寫一個函數,例如:

template<typename T> void reset(T &t) { t = T{}; } 

我想你也可以寫s = decltype(s){};,只要s不是一個參考。

+1

爲什麼不明確使用你的'hoped'來解析。 's = SomeStruct {}'?這似乎比函數調用reset()更清晰。 –

+1

@LokiAstari很好,我們可能遠離's'的聲明,因此檢查這實際上做的是正確的事情並不那麼容易。如果我們不小心把's = SomeOtherStruct {};'然後其他奇怪的影響可能會發生。我嘗試使用最小化錯誤可能性的代碼模式(特別是非顯而易見的錯誤)。我想'decltype'版本是最好的。我發現那不美觀,但也許我需要更新我的美學 –

+0

我對「SomeOtherStruct {}」有一些看法。那麼它對「decltype」更有意義,但仍然看起來很醜陋(而美學很重要)。 –