即析構函數將也隱含 呼叫的auto_ptr 對象的析構函數。而這將刪除 指針其持有,這點到C 對象 - 不知道C的 定義!這出現在定義了結構A的構造函數 的 .cpp文件中。
這是好奇然後
5.3.5/5狀態 - 「如果要刪除的對象具有不完整的類型在 缺失的點和完全 類具有一個非平凡析構函數或 解除分配函數,則行爲 未定義。「
我的問題是,爲什麼不是這樣的一個程序,試圖刪除指向不完整類型的指針被視爲不合格?爲什麼推入的條件(和完整的類有一個不平凡的析構函數..)「未定義行爲」的境界?
什麼是 '和' 意味着什麼?
編輯2:
低於代碼合式? VS和Gcc/CLang編譯,但Comeau發出警告。我想所有這些都是標準中提到的未定義行爲的一部分。我的問題是'爲什麼這不是不合格,但沒有定義'?
#include <iostream>
#include <memory>
using namespace std;
struct C;
// Is this the POI for auto_ptr<C>? $14.6.4.1/3
struct A{
A();
auto_ptr<C> mc;
~A(){} // how does it link to C::~C at this point?
};
struct C{};
A::A():mc(new C){}
int main(){
A a;
}
是的。這是我的忽視。更新它 – Chubsdad 2010-10-18 06:10:36
+1,有趣。這是否真的發生過,有必要刪除一個POD類型而沒有它的定義?沒有瑣碎的析構函數的類是不是最不可能不完整的? Hmfph。 – Potatoswatter 2010-10-18 06:27:34
你能否提供一個參考文章/材料,你提到gotw? – Chubsdad 2010-10-18 07:37:55