int foo = foo;
編譯。 C++標準的哪一部分允許這樣做?int foo = foo的標準參考
回答
3.3.1點聲明[basic.scope.pdecl]
聲明的一個名字的一點是後立即其完整說明符(第8節)和它的初始值設定前(如果有的話),
的行爲,如果該聲明是在文件範圍是明確界定。如果你有在申報範圍的功能,如果你使用foo
稍後[這將被初始化爲在這種情況下一些未指定值]的行爲將是不確定的。
我會+1,但你完全沒有提到OP的程序有未定義的行爲,並且不能使用_。 – 2011-05-31 14:40:47
@Tomalak:代碼*可能*有UB,但不一定。 OP似乎完全意識到這不是真的應該使用的東西,並且對它爲什麼編譯的純學術觀點感到好奇。 – 2011-05-31 14:43:18
@Jerry:仙女nuff。 – 2011-05-31 14:44:47
This?
int main() {
int foo = foo;
}
目的foo
的=
後確實存在,根據[basic.scope.pdecl]
:
聲明的一個名字的一點是後立即其完整說明符(第8節)和其初始值設定前(如果有的話)。
然而,該方案整體上是不確定的,因爲你使用(在RHS)的未初始化值:
int x = x;
這裏[..]x
與自己的(不確定)初始化值。
和:
雖然 「推斷和虐待的規定」 的標準,an lvalue-to-rvalue conversion is performed on the RHS expression foo
。
和([conv.lval]
):
非函數的左值(3.10), 非陣列類型T可以被轉換爲 右值。如果T是不完整的類型, 需要此 轉換的程序是不合格的。如果 對象到的左值是指是 不類型T的對象,而不是源自T的類型的 對象,或者如果 對象是未初始化,即必要這種轉換的程序 具有 未定義的行爲。
具有適當的警告級別,you will get told about it;但是,允許編譯調用未定義行爲的程序。當你運行它們時,它們可以做任何事情。
或者,這個怎麼樣?
int foo = foo;
int main() {}
請注意foo
是一個「全局」。這些是零初始化作爲第一步,根據[basic.start.init]
:
具有靜態存儲的持續時間(3.7.1)的對象應是零初始化(8.5)任何其它初始化發生之前。
因此,您將得到一個值爲0的int foo
;它是有效的,在這一點上,按照[basic.scope.pdecl]
上方,並且每[stmt.decl]
爲:
具有靜態存儲 持續時間所有 本地對象的零初始化(8.5)(3.7.1)的任何 之前執行其他初始化發生。 [..]
你那麼如果有點神祕值初始化到foo
(本身),即0。
這是良好定義...。
在徹底的利益,這裏的第三和最後一種情況:
int foo = 42;
int main() {
int foo = foo;
}
可悲的是,this is the same as the first case。由於本地foo
已經宣佈在由初始評估的時間範圍,初始化使用本地foo
和你仍然堅持與未定義行爲。全局foo
未使用。
OTOH,如果它是一個全球性的,行爲定義。 – 2011-05-31 14:41:41
@Jerry:我的程序中沒有全局變量。如果OP程序中有全局變量(或者他的'foo'聲明發生在命名空間範圍內),他需要說明這一點,因爲它完全改變了問題。 – 2011-05-31 14:42:51
@Jerry:好的。那麼我也會爲這種情況添加一個條款。 – 2011-05-31 14:46:23
- 1. static_cast <int>(foo)vs.(int)foo
- 2. 這是什麼意思? int foo = foo + 4;
- 3. foo(int * arr)和foo(int arr [])之間的任何區別?
- 4. 作爲參數($ foo)和(foo $ foo)之間的區別
- 5. var foo = foo ||警報(FOO);
- 6. func foo(arr [] int)int和func foo(arr [num] int)有什麼區別int
- 7. 標準SELECT BLA1,bla2一個從Foo
- 8. 語法「Foo(int v):val_(v){}」?
- 9. 更快$ foo? $ foo的:「棒」
- 10. 哪個`if(!isset($ foo)OR(isset($ foo)AND $ foo == $ bar))`或`if(!isset($ foo)OR $ foo == $ bar)`更好?
- 11. mod_rewrite/foo到/index.php?id=foo AND/foo/foo2到/index.php?id=foo/foo2
- 12. 是`foo as? Foo「在kotlin中完全等價於foo?foo?
- 13. foo = foo有意義嗎?
- 14. Foo無法投射到Foo
- 15. var foo =(function(){...})(); ... FOO()不工作
- 16. + foo + vs。 foo。差異在PHP?
- 17. 爲什麼「foo = foo || {};」不行?
- 18. 類foo,類foo()和類foo(object)之間的區別?
- 19. 可以區分foo [.2]和foo的Mathematica函數foo [.20]
- 20. 「struct foo *」和「foo *」之間的區別foo是一個struct嗎?
- 21. 比較$ foo的is_array或$ foo是假的
- 22. Foo()和Foo()是什麼樣的數組?
- 23. 參數化取代($ {FOO%酒吧},$ {FOO杆}等),而不使用eval
- 24. 爲什麼許多lisps有「foo」,「foo-1」,「foo-2」等函數名?
- 25. 如何篩選{「foo」:「bar」,「bar」:「foo」} grok只獲取foo字段?
- 26. 爲什麼代碼「foo :: foo :: foo :: foob」編譯?
- 27. Rails 2.3.12:分別路由'GET/foo','PUT/foo'和'<any>/foo/bar'
- 28. 在Foo中聲明對象Foo?
- 29. 「foo =(foo + 1)%bar」究竟幹什麼?
- 30. R:apt-get install r-cran-foo與install.packages(「foo」)
相關:http://stackoverflow.com/questions/5450633/c-what-does-this-mean-int-foo-foo-4 – 2011-05-31 17:47:04
另請參閱[初始化是否需要左值到右值的轉換?是'INT X = X;'UB](http://stackoverflow.com/q/14935722/1708801)和[已C++標準相對於在C++ 14使用不定值和未定義的行爲的改變]? (http://stackoverflow.com/q/23415661/1708801) – 2015-09-22 15:27:16