Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 我可以打电话给析构函数操作员吗?_C++11_Destructor_Move Semantics - Fatal编程技术网

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与移动构造函数一起使用。