2016-01-18 32 views
0

考慮下面的程序:Test t = Test();在C++ 98中會發生什麼?

#include <iostream> 
struct Test 
{ 
    int a; 
}; 
int main() 
{ 
    Test t=Test(); 
    std::cout<<t.a<<'\n'; 
} 

Test t=Test();值初始化臨時&副本進行初始化。 (大多數編譯器優化了複製操作(來源:value initialization))。但值初始化由C++03引入。當執行Test t=Test();時,C++98會發生什麼?是否保證在任何C++98編譯器中,我將得到0作爲輸出(在這種情況下,值爲t.a)? 。它是否在C++98中執行默認初始化?

+2

[此問題](http://stackoverflow.com/questions/27349679/is-value-initialization-part-of-the-c98-standard-if-not-why-was-it-added-in)可能會對你感興趣。 – TartanLlama

回答

3

C++標準(1998)

[dcl.fct.def]

7所述的對象,其初始化爲空集括號的,即,(),應是缺省初始化。

[dcl.init]

5要類型T的對象的零初始化存儲裝置:

- 如果T是一個標量類型(3.9)中,存儲被設定到0(零)的值轉換爲T;

- 如果T是非聯合類類型,則將每個非靜態數據成員和每個基類子對象的存儲器初始化爲零;

- 如果T是聯合類型,其第一個數據成員89的存儲空間被初始化;

- 如果T是一個數組類型,則每個元素的存儲都是零初始化的;

- 如果T是引用類型,則不執行初始化。

爲默認初始化類型T的對象是指:

- 如果T是一個非POD類型(第9節),T的默認構造函數被調用(以及初始化是形成不良的,如果T沒有可訪問的默認構造函數);

- 如果T是數組類型,則每個元素都是默認初始化的;

- 否則,該對象的存儲器將被初始化爲零。

看來,臨時是缺省初始化,這意味着零初始化爲一個POD類型(Test是),因此t.a == 0有保證。

由於C++ 03這是值初始化和保留相同的保證。

似乎在C++ 03中增加了值初始化和重新定義默認初始化,以允許不初始化標量和POD類型(在某些情況下)。

+0

和值t.a保證爲0,因爲C++ 03。對? – Destructor

+1

@PravasiMeet我檢查了默認初始化的定義並重寫了答案。看起來這個保證在C++ 03之前和之後都有。 – user2079303

相關問題