[英]Initializing member variable with pointer to itself
我聽說以下內容是有效的,並且將x
未初始化,就像它是int x;
:
int x = x;
那這個呢? 這段代碼是否等同於上面的代碼:
struct Foo
{
Foo(int Foo::*p) : x(this->*p) { }
int x;
};
int main() {
Foo f(&Foo::x);
}
fx
還沒有初始化嗎? 我有未定義的行為嗎?
C ++ 14清楚地表明,使用不確定的值是未定義的行為 ,從第8.5
節( 強調我的 ):
如果沒有為對象指定初始化程序,則默認初始化該對象。 當獲得具有自動或動態存儲持續時間的對象的存儲時,該對象具有不確定的值,並且如果沒有對該對象執行初始化,則該對象保留不確定的值,直到替換該值為止 (5.17 [expr.ass]) 。 [注意:具有靜態或線程存儲持續時間的對象是零初始化的,請參見3.6.2 [basic.start.init]。 -end note] 如果評估產生不確定的值,則行為是未定義的,除非在以下情況中 :
唯一的例外是unsigned char。 這可能是他們改變示例部分3.3.2的原因:
int x = 12;
{ int x = x; }
至:
unsigned char x = 12;
{ unsigned char x = x; }
我沒有看到任何排除你的例子的例外。
x
具有不確定的值,直到它被初始化,然后在初始化期間訪問其值,從而調用未定義的行為。
這段代碼是否等同於上面的代碼:
我想是的,是的,因為你基本上是這樣做的: x(x)
,只是使用一個指針來讀取x
的當前值作為輸入值,但x
還沒有被初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.