在下面的 C++ 代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?不会是明确的 ctor 调用更多富有表现力的 and unified与 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
在那个地址。因此,取消引用x
as an X
类型或访问它的成员/方法将是未定义的行为。
所以之间的主要区别x->X();
(假设语法)和x->~X()
是在第二种情况下,您有一个可以调用(特殊)成员(例如析构函数)的对象,而在第一种情况下,还没有对象您可以在其上调用方法(甚至是特殊方法 - 构造函数)。
您可能会争辩说,这条规则可能有一个例外,但最终这将是语法偏好的问题,在这两种情况下都会出现不一致。使用当前语法,对构造函数的调用看起来不像对构造函数的调用,在您建议的语法中,与析构函数调用是对称的,但管理何时可以取消引用/访问对象方法的规则不一致。实际上,必须有一个例外,允许在还不是对象的东西上调用方法。那么你必须在标准的文字中严格定义还不是对象的东西.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)