這是從invoking the copy constructor within the constructor分拆。在初始化列表的末尾是否完全構建了一個對象?
我相信一個對象是完全形成的,並且可以期望在初始化列表末尾表現出來(編輯:我對此有錯誤!)。具體來說,成員函數和從構造函數本身中訪問本地狀態的行爲將與其他任何成員函數完全相同。
雖然這似乎是一個有點爭議的觀點,但替代方案是隻有一旦構造函數正常返回,對象完全形成。
以下是對此的一個快速&髒測試用例,它顯示了初始化列表中提到的所有成員字段被初始化,以及沒有得到默認構建的成員字段。
#include <cstdio>
struct noise
{
noise() { printf("noise default constructed\n"); }
noise(int x) { printf("noise integer constructed %u\n", x); }
~noise() { printf("noise dtor\n"); }
};
struct invoke : public noise
{
noise init;
noise body;
invoke() : noise(3), init(4)
{
body = noise(5);
throw *this; // try to use the object before returning normally
}
~invoke() { printf("invoke dtor\n"); }
};
int main()
{
try
{
invoke i;
}
catch (...)
{
}
}
這版畫,我的機器上至少,
noise integer constructed 3
noise integer constructed 4
noise default constructed
noise integer constructed 5
noise dtor
noise dtor
noise dtor
noise dtor
invoke dtor
noise dtor
noise dtor
noise dtor
一如往常,這是很難區分的作品,如規定從作品-AS-我的編譯器實現的!這實際上是UB嗎?
有趣。除了析構函數以外,對一個對象的函數是否需要一個完全構造的對象或一個擁有所有成員的對象? –
取決於該功能,可以在施工和銷燬過程中調用正常的成員函數。有一個虛擬功能的捕獲,他們可能不會調用您期望的實現,並且經常建議在施工期間不要調用。 – Niall
這非常令人興奮。謝謝 –