簡體   English   中英

值初始化是C ++ 98標准的一部分嗎? 如果沒有,為什么它被添加到C ++ 03標准中?

[英]Is value initialization part of the C++98 standard? If not, why was it added in the C++03 standard?

干杯和hth。 - Alf在這個答案中發表評論說,與C ++ 98相比,值初始化可以說是C ++ 03的一個新特性。 我想知道他的意思。

值初始化是C ++ 98的一部分嗎? 它是出現在概念中而不是名義上嗎? 為什么它被添加到C ++ 03標准中?

我有'03標准的副本,但不是'98標准。 這是默認初始化和值初始化的定義。

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

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

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

- 否則,對象被零初始化。

對值類型T的對象進行值初始化意味着:

- 如果T是具有用戶聲明的構造函數(12.1)的類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);

- 如果T是沒有用戶聲明的構造函數的非聯合類類型,則T的每個非靜態數據成員和基類組件都是值初始化的;

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

- 否則,對象被零初始化

我的猜測是'98有默認初始化但不是值初始化,並且兩者之間存在一些關鍵差異。 說實話,我在解析這里的標准時遇到了麻煩,我不明白這些定義之間的區別。

引用ISO / IEC 14882:1998標准文件 (已從ISO中撤回):

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

  • 如果T是非POD類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);
  • 如果T是數組類型,則每個元素都是默認初始化的;
  • 否則,對象的存儲被零初始化。

在第7段中:

初始化器為空的括號集(即()應默認初始化。

有關變更背后的基本原理的詳細信息可以在發生變化的缺陷報告中找到:

此定義適用於局部變量,但不適用於因執行T()形式的表達式而初始化的對象,因為這些表達式產生的對象將立即復制,因此應具有可確保的值。可復制。
為此,我建議在8.5,第5段中增加以下新案文:

類型T的對象進行值初始化意味着:

  • 如果T是具有用戶聲明的構造函數(12.1)的類類型(子句9 [class]),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);
  • 如果T是沒有用戶聲明的構造函數的類類型,那么T的每個非靜態數據成員和基類組件都是值初始化的;
  • 如果T是數組類型,那么每個元素都是值初始化的;
  • 否則,對象的存儲被零初始化。

另外,我建議在5.2.3第2段中將''default-initialization''改為''value-initialization''。

然后,一個歷史的解釋:

古代歷史

曾幾何時,一位名叫Laura Eaves的AT&T編譯器開發人員問我:'' int()的值應該是什么?''我的第一個想法是它應該與x之后的值相同

 int x; 

但我很快就意識到這個定義是行不通的。 原因是x有一個不確定的值(假設它是一個局部變量),但我們並不介意x是不確定的,因為我們可能會在使用它之前為x賦值。 相反, int()最好沒有不確定的值,因為復制這樣的值具有未定義的效果。 禁止編譯器在編譯期間標記int() ,只允許它在執行期間標記它是愚蠢的! [...]

暫無
暫無

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

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