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

问题描述 投票:0回答:1

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

我可以做点什么:

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

我试图实现的是避免代码重复。

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

c++11
1个回答
0
投票

原则上,如果您随后使用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派生的类的基类子对象。由于这个原因和其他原因,通常不这样做。

© www.soinside.com 2019 - 2024. All rights reserved.