为什么不能在析构函数可以的同时显式调用构造函数?

丹尼尔·兰格(Daniel Langr):

在下面的C ++代码中,允许我显式调用析构函数,但不能显式调用构造函数。这是为什么?显式的ctor调用会不会与dtor案例更具表达性统一性

class X { };

int main() {
  X* x = (X*)::operator new(sizeof(X));
  new (x) X;  // option #1: OK
  x->X();     // option #2: ERROR

  x->~X();
  ::operator delete(x);
}
鲍洛夫:

因为在构造函数启动之前X,该地址处没有类型的对象这样,取消引用xX类型或访问其成员/方法将是未定义行为。

因此,x->X();(假设语法)与的主要区别在于x->~X(),在第二种情况下,您有一个对象可以在其上调用(特殊)成员,例如析构函数,而在第一种情况下,尚无对象可以在其上调用方法(甚至是特殊方法-构造函数)。

您可能会争辩说该规则可能会有例外,但是最终这将是语法首选项的问题,在这两种情况下您都不一致。使用当前语法,对构造函数的调用看起来不像对构造函数的调用,在您建议的语法中,析构函数的调用是对称的,但是控制何时可以取消引用/访问对象方法的规则不一致。实际上,必须有一个例外,允许在还不是对象的对象上调用方法。然后,您必须在标准的字母中严格定义还不是对象的内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在显式调用构造函数时不能引用实例方法?

显式调用基类的析构函数/构造函数合法吗?

为什么析构函数比构造函数调用得更多?

什么时候可以安全地在构造函数和析构函数中调用this->

根据C ++标准,显式调用构造函数和析构函数是否安全?

Python继承:是否必须显式调用parent构造函数和析构函数?

当析构函数调用构造函数时会发生什么?

C ++:显式调用模板参数的typedef的析构函数

为什么带有auto_ptr和显式析构函数的struct无法交换

显式调用`int`析构函数-为什么需要类型别名?

使用decltype的显式析构函数调用

为什么要调用析构函数

为对象分配值时为什么调用构造函数和析构函数

为什么在Friend函数中调用析构函数

为什么std :: vector在离开其他作用域的同时调用析构函数?

在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

为什么显式调用析构函数会导致双重释放?

什么时候需要进行显式的析构函数调用?

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么std :: vector的构造函数调用自定义类的析构函数?

为什么在构造时调用C ++类的析构函数?

显式调用子析构函数是否也调用父析构函数

显式调用析构函数

为什么构造函数调用取决于默认析构函数的存在?

如何显式调用 std 迭代器的析构函数?

通过显式调用其析构函数和构造函数来重新创建对象

为什么同一个类对象的构造函数和析构函数被隐式调用多次

为什么带有析构函数的类不能简单地移动构造?

为什么不调用析构函数?