簡體   English   中英

POD與非POD類類型的默認初始化

[英]Default initialization of POD vs. non-POD class types

C ++標准說(8.5 / 5):

默認初始化T類型的對象意味着:

  • 如果T是非POD類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的)。

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

  • 否則,該對象是零初始化的。

有了這段代碼

struct Int { int i; };

int main()
{
    Int a;
}

對象a是默認初始化的,但顯然ai不一定等於0。 這與標准是否相矛盾,因為Int是POD而不是數組?

編輯class更改為struct以便Int是POD。

從2003年標准的8.5.9:

如果沒有為對象指定初始化程序,並且該對象是(可能是cv限定的)非POD類類型(或其數組),則該對象應默認初始化; 如果對象是const限定類型,則底層類類型應具有用戶聲明的默認構造函數。 否則,如果沒有為非靜態對象指定初始化程序,則該對象及其子對象(如果有)具有不確定的初始值 ); 如果對象或其任何子對象是const限定類型,則程序格式錯誤。

您顯示的類是POD,因此突出顯示的部分適用,並且您的對象根本不會被初始化(因此您引用的第8.5 / 5節根本不適用)。

編輯:根據您的評論,這里是當前標准最終工作草案第8.5 / 5節的引用(我沒有真正的標准,但據說FDIS非常接近):

默認初始化T類型的對象意味着:

- 如果T是一個(可能是cv限定的)類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);

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

- 否則,不執行初始化。

您的變量未初始化。 使用

Int a = Int();

初始化你的POD或聲明一個標准的構造函數,使其成為非POD; 但您也可以出於性能原因使用未初始化的POD,例如:

Int a;
a.i = 5;

不,對象a未默認初始化。 如果你想默認初始化它,你必須說:

Int a = Int() ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM