2010-12-07 123 views
7

看一看這個代碼片斷臨時對象混亂

struct S{ int i; int j;}; 

int main() 
{ 
    assert(S().i == S().j) // is it guaranteed ? 
} 

爲什麼?

回答

10

是否有保證?

是的,它是有保證的。 S().iS().j的值將是0()意味着value initialization.(這意味着ij將是零初始化因爲S是一個沒有用戶定義的默認構造函數的類)

+0

哇! Thnx很多。 – Bollinger 2010-12-07 16:22:37

+0

特別是,在`struct S`中加入`S(){}`(一個無用的用戶定義的ctor)會導致`i`和`j`未初始化,這意味着`assert引起。 – 2010-12-07 17:16:28

+0

是的權利[.....] – 2010-12-07 17:18:48

0

從C++標準ISO/IEC 14882:2003(E)點3.6.2

靜態存儲持續時間(3.7.1)的對象應在任何其他初始化 發生之前進行零初始化(8.5)。

所以這是有效的,因爲兩個變量都是零初始化的。

-1

技術上,是的。它們將初始化爲0 (至少在大多數編譯器的非調試版本中,Visual Studio的編譯器通常會在調試版本中將未初始化的變量初始化爲特定模式) 。但是,如果您正在進行代碼審查,如果您因爲沒有明確初始化變量而大聲吼叫,請不要感到驚訝。