即析构函数将也隐含 呼叫的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