在下面的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
,该地址处没有类型的对象。这样,取消引用x
为X
类型或访问其成员/方法将是未定义行为。
因此,x->X();
(假设语法)与的主要区别在于x->~X()
,在第二种情况下,您有一个对象可以在其上调用(特殊)成员,例如析构函数,而在第一种情况下,尚无对象可以在其上调用方法(甚至是特殊方法-构造函数)。
您可能会争辩说该规则可能会有例外,但是最终这将是语法首选项的问题,在这两种情况下您都不一致。使用当前语法,对构造函数的调用看起来不像对构造函数的调用,在您建议的语法中,析构函数的调用是对称的,但是控制何时可以取消引用/访问对象方法的规则不一致。实际上,必须有一个例外,允许在还不是对象的对象上调用方法。然后,您必须在标准的字母中严格定义还不是对象的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句