C++11 我可以打电话给析构函数操作员吗?
我的类中有非平凡的析构函数 我可以这样做吗C++11 我可以打电话给析构函数操作员吗?,c++11,destructor,move-semantics,C++11,Destructor,Move Semantics,我的类中有非平凡的析构函数 我可以这样做吗 Foo& Foo::operator=(Foo&& from) { ~Foo() // Copy the stuff and cleanup "from" } 我试图实现的是避免代码重复 此外,我还可以编写一些清理函数,但如果我可以调用析构函数,那又有什么用呢?原则上,如果你使用placement new将对象构造回现在的空白空间,你可以这样调用析构函数。大概是这样的: Foo& Foo::operat
Foo& Foo::operator=(Foo&& from) {
~Foo()
// Copy the stuff and cleanup "from"
}
我试图实现的是避免代码重复
此外,我还可以编写一些清理函数,但如果我可以调用析构函数,那又有什么用呢?原则上,如果你使用placement new将对象构造回现在的空白空间,你可以这样调用析构函数。大概是这样的:
Foo& Foo::operator=(Foo&& from) {
void* p = this;
~Foo();
return *(new(p) Foo(std::move(from))); // calls Foo(Foo&&) constructor
}
这种方法有很大的局限性-参见。例如,如果Foo具有const-qualified或reference类型的非静态成员,它将显示未定义的行为;或者,如果此运算符实际应用于从Foo派生的类的基类子对象。由于这一点和其他原因,通常不会这样做。原则上,如果使用placement new将对象构造回现在的空白空间,则可以通过这种方式调用析构函数。大概是这样的:
Foo& Foo::operator=(Foo&& from) {
void* p = this;
~Foo();
return *(new(p) Foo(std::move(from))); // calls Foo(Foo&&) constructor
}
这种方法有很大的局限性-参见。例如,如果Foo具有const-qualified或reference类型的非静态成员,它将显示未定义的行为;或者,如果此运算符实际应用于从Foo派生的类的基类子对象。由于这一点和其他原因,通常不会这样做。如果调用析构函数,对象将不存在,则需要在其位置构造一个新的析构函数。您可以将placement new与移动构造函数一起使用。如果调用析构函数,则对象将不再存在,您需要在其位置构造一个新的析构函数。可以将placement new与移动构造函数一起使用。