2014-09-23 62 views
2

迂迴地說,是x在下面的代碼中初始化或沒有?是一個本地作用域變量,初始化爲未確定的值,或未初始化?

int main() 
{ 
    int x; 
} 

有關於它的一些段落中8.5初始值設定[dcl.init](對於C++ 11),但不通過任何實施例的支持。

+4

簡答題,沒有。很長的答案,不。 – 2014-09-23 15:47:14

+2

它是默認初始化的。這意味着不執行初始化(對於'int')。 – dyp 2014-09-23 15:47:45

+0

因此它保持不確定性,所以閱讀它(因爲它是自動存儲類)是UB。 – Deduplicator 2014-09-23 15:50:41

回答

5

它是正式的默認初始化,這意味着對於int s,不執行初始化。

[dcl.init]/12(N3797)

如果對象沒有指定初始化,對象是缺省初始化;如果不進行初始化,具有自動或動態存儲持續時間的對象具有不確定的值

[dcl.init]/7

缺省初始化T類型的對象是指:

  • 如果T是一個(可能CV修飾)類類型,默認 構造爲T爲c alled [...];

  • if T是一個數組類型,每個元素都是默認初始化的;

  • 否則,不執行初始化

+3

所以它被初始化了,但是這個動作由「不執行初始化」組成。要麼是這個,要麼是默認初始化的,但是在這種情況下,默認初始化不是一種初始化。或者,「初始化」這個術語在標準中沒有形式上的含義,而「默認初始化」和「初始化被執行」一樣。嘎。 – Yakk 2014-09-23 15:50:00

+0

@Yakk正是。提醒我完整的類型無法完成。 – dyp 2014-09-23 15:53:00

+0

@Yakk:它保持不確定性,因此事實上是正確的,併爲其狀態的標準符合性措辭。因此,如果它是自動存儲類,則根據4.1左值到右值轉換[conv.lval]使用它。 – Deduplicator 2014-09-23 15:53:19

3

不,它不是。根據標準,x缺省初始化([dcl.init]/6):

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

- 如果T爲(可能CV修飾)類型[...]

- 如果T是數組類型[...]

- 否則,沒有初始化ialization進行了

x因此未初始化,因爲沒有執行初始化。
因此,該對象具有不確定的值([dcl。INIT]/11):

如果對象沒有指定初始化,對象是 缺省初始化; 如果未執行初始化,則具有自動或動態存儲持續時間的對象 具有不確定值

此外,如果我們訪問它的存儲,不確定的值 - 換句話說,執行在其上的左值到右值轉換 - 我們將誘導未定義行爲([conv.lval]/1):

如果到該glvalue指的對象是[..],或者如果對象 是未初始化,即必要這種轉換的程序具有 未定義行爲

2

我的理解是變量x在內存中的位置是保留的,但未設置爲值(未初始化)。由於它未初始化,因此任何舊值都將被視爲「垃圾」int。