從這個FAQ:What are Aggregates and PODs and how/why are they special?吊艙和規則轉到
我們有這樣的一部分:
goto語句。正如你所知道的,它是非法的(編譯器應該發出一個錯誤),通過goto從某個變量尚未處於範圍內的點跳轉到已經處於範圍內的點。此限制僅適用於變量爲非POD類型的情況。在下面的例子中,f()是格式不正確的,而g()是格式良好的。請注意,Microsoft編譯器對此規則過於自由 - 只是在這兩種情況下發出警告。
int f() {
struct NonPOD { NonPOD(){}};
goto label;
NonPOD x;
label:
return 0;
}
int g(){
struct POD {int i; char c;};
goto label;
POD x;
label:
return 0;
}
我想了解爲什麼區別?它似乎可能是,即使POD是 goto後宣佈它已經初始化,沒有更多的需要做,而非POD未被初始化的 。還是我吠叫錯了樹?
所以這意味着在POD情況下初始化已經完成,但在非POD的情況下,它還沒有完成。 –
POD不能有ctor - 這是要求之一,但我認爲如果你使用{} init,也會失敗。 –
那麼,構造函數是隱含的,它必須在某個點運行。 goto不能跳過初始化,所以POD必須已經初始化。我試圖弄清楚什麼時候會發生。 –