我可以从移动分配运算符中调用析构函数吗?

时间:2019-12-17 13:28:27

标签: c++11 destructor move-semantics

我班上有不平凡的析构函数。

我可以这样做吗:

Foo& Foo::operator=(Foo&& from) {
    ~Foo()
    // Copy the stuff and cleanup "from"
}

我要实现的目的是避免代码重复。

此外,我可以编写一些清理函数,但是如果可以调用析构函数,那又有什么用呢?

1 个答案:

答案 0 :(得分:3)

原则上,如果您随后使用placement new将对象构造回现在为空的空间,则可以以这种方式调用析构函数。像这样:

Foo& Foo::operator=(Foo&& from) {
  void* p = this;
  ~Foo();
  return *(new(p) Foo(std::move(from)));  // calls Foo(Foo&&) constructor
}

此方法有很多局限性-例如this answer。例如,如果Foo具有const限定或引用类型的非静态成员,它将表现出不确定的行为;或者该运算符实际上应用于从Foo派生的类的基类子对象。由于这个和其他原因,通常不这样做。