参考这里
该析构函数还将隐式调用 auto_ptr 对象的析构函数。这将删除它持有的指针,该指针指向 C 对象 - 不知道 C 的定义!这出现在 .cpp 文件中,其中定义了 struct A 的构造函数。
这很好奇,然后
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;
}