簡體   English   中英

使用指向自身的指針初始化成員變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM