哦,C ++專家們,我尋求您的智慧。與我說標準話,并告訴我C ++是否保證以下程序:#include <iostream>using namespace std;struct A{ A() { cout << "A::A" << endl; } ~A() { cout << "A::~" << endl; }};struct B{ B() { cout << "B::B" << endl; } ~B() { cout << "B::~" << endl; }};struct C{ C() { cout << "C::C" << endl; } ~C() { cout << "C::~" << endl; }};struct Aggregate{ A a; B b; C c;};int main(){ Aggregate a; return 0;}將永遠產生A::AB::BC::CC::~B::~A::~換句話說,是否保證成員按聲明順序初始化并以相反的順序銷毀?
3 回答

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

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