看一看這個代碼片斷臨時對象混亂
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
爲什麼?
看一看這個代碼片斷臨時對象混亂
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
爲什麼?
是否有保證?
是的,它是有保證的。 S().i
和S().j
的值將是0
。 ()
意味着value initialization.(這意味着i
和j
將是零初始化因爲S
是一個沒有用戶定義的默認構造函數的類)
從C++標準ISO/IEC 14882:2003(E)點3.6.2
靜態存儲持續時間(3.7.1)的對象應在任何其他初始化 發生之前進行零初始化(8.5)。
所以這是有效的,因爲兩個變量都是零初始化的。
技術上,是的。它們將初始化爲0
(至少在大多數編譯器的非調試版本中,Visual Studio的編譯器通常會在調試版本中將未初始化的變量初始化爲特定模式)
。但是,如果您正在進行代碼審查,如果您因爲沒有明確初始化變量而大聲吼叫,請不要感到驚訝。
哇! Thnx很多。 – Bollinger 2010-12-07 16:22:37
特別是,在`struct S`中加入`S(){}`(一個無用的用戶定義的ctor)會導致`i`和`j`未初始化,這意味着`assert引起。 – 2010-12-07 17:16:28
是的權利[.....] – 2010-12-07 17:18:48