3 回答

TA貢獻1812條經驗 獲得超5個贊
換句話說,是否保證成員按聲明順序初始化并以相反的順序銷毀?
雙方都同意。見12.6.2
6初始化應按以下順序進行:
首先,并且僅對于如下所述的最大派生類的構造函數(shù),虛擬基類應按照它們在基類的有向無環(huán)圖的深度優(yōu)先從左到右遍歷時出現(xiàn)的順序進行初始化,其中“左“從右到右”是基類名稱在派生類base-specifier-list中的出現(xiàn)順序。
然后,直接基類應按照它們出現(xiàn)在base-specifier-list中的聲明順序進行初始化(與mem-initializers的順序無關)。
然后,非靜態(tài)數(shù)據(jù)成員應按照它們在類定義中聲明的順序進行初始化(同樣,無論mem-initializer的順序如何)。
最后,執(zhí)行構造函數(shù)主體的復合語句。[注意:聲明順序是強制執(zhí)行的,以確保以相反的初始化順序銷毀基礎和成員子對象?!沧

TA貢獻1765條經驗 獲得超5個贊
是的,該標準保證對象以與創(chuàng)建對象相反的順序被破壞。原因是一個對象可能使用另一個對象,因此依賴于它。考慮:
struct A { };
struct B {
A &a;
B(A& a) : a(a) { }
};
int main() {
A a;
B b(a);
}
如果a是之前破壞b,然后b將舉行無效成員引用。通過以創(chuàng)建對象的相反順序破壞對象,我們保證正確破壞。
- 3 回答
- 0 關注
- 613 瀏覽
添加回答
舉報