迂迴地說,是x
在下面的代碼中初始化或沒有?是一個本地作用域變量,初始化爲未確定的值,或未初始化?
int main()
{
int x;
}
有關於它的一些段落中8.5初始值設定[dcl.init](對於C++ 11),但不通過任何實施例的支持。
迂迴地說,是x
在下面的代碼中初始化或沒有?是一個本地作用域變量,初始化爲未確定的值,或未初始化?
int main()
{
int x;
}
有關於它的一些段落中8.5初始值設定[dcl.init](對於C++ 11),但不通過任何實施例的支持。
它是正式的默認初始化,這意味着對於int
s,不執行初始化。
[dcl.init]/12(N3797)
如果對象沒有指定初始化,對象是缺省初始化;如果不進行初始化,具有自動或動態存儲持續時間的對象具有不確定的值
[dcl.init]/7
要缺省初始化
T
類型的對象是指:
如果
T
是一個(可能CV修飾)類類型,默認 構造爲T
爲c alled [...];if
T
是一個數組類型,每個元素都是默認初始化的;否則,不執行初始化。
所以它被初始化了,但是這個動作由「不執行初始化」組成。要麼是這個,要麼是默認初始化的,但是在這種情況下,默認初始化不是一種初始化。或者,「初始化」這個術語在標準中沒有形式上的含義,而「默認初始化」和「初始化被執行」一樣。嘎。 – Yakk 2014-09-23 15:50:00
@Yakk正是。提醒我完整的類型無法完成。 – dyp 2014-09-23 15:53:00
@Yakk:它保持不確定性,因此事實上是正確的,併爲其狀態的標準符合性措辭。因此,如果它是自動存儲類,則根據4.1左值到右值轉換[conv.lval]使用它。 – Deduplicator 2014-09-23 15:53:19
不,它不是。根據標準,x
是缺省初始化([dcl.init]/6):
要類型T的對象是指默認初始化:
- 如果
T
爲(可能CV修飾)類型[...]- 如果
T
是數組類型[...]- 否則,沒有初始化ialization進行了。
x
因此未初始化,因爲沒有執行初始化。
因此,該對象具有不確定的值([dcl。INIT]/11):
如果對象沒有指定初始化,對象是 缺省初始化; 如果未執行初始化,則具有自動或動態存儲持續時間的對象 具有不確定值。
此外,如果我們訪問它的存儲,不確定的值 - 換句話說,執行在其上的左值到右值轉換 - 我們將誘導未定義行爲([conv.lval]/1):
如果到該glvalue指的對象是[..],或者如果對象 是未初始化,即必要這種轉換的程序具有 未定義行爲。
我的理解是變量x在內存中的位置是保留的,但未設置爲值(未初始化)。由於它未初始化,因此任何舊值都將被視爲「垃圾」int。
簡答題,沒有。很長的答案,不。 – 2014-09-23 15:47:14
它是默認初始化的。這意味着不執行初始化(對於'int')。 – dyp 2014-09-23 15:47:45
因此它保持不確定性,所以閱讀它(因爲它是自動存儲類)是UB。 – Deduplicator 2014-09-23 15:50:41