[英]Deleted constructor called in initializer
是的,我知道析构函数很重要,但在这种情况下 Foo 和 Bar 都将成为单例。 出于调试目的,我想确保单例对象永远不会被删除(我不小心做了一次)。
class Bar {
public:
Bar();
~Bar() = delete;
}
class Foo {
public:
Foo();
Bar b;
}
所有构造函数和析构函数体都是空的。 所以 cpp 看起来像
Foo::Foo() {
}
此代码会导致我不希望出现的错误。 我会理解它对在 Foo 的析构函数方法中没有析构函数感到沮丧,但我在构造函数上得到了一个错误。 出于某种原因,编译器说它引用了一个已删除的函数。 为什么它在构造函数中关心这个?
有Bar b;
因为类成员意味着b
必须有一个可访问的析构函数。
这样做的基本原理是,如果在构造 a Foo
期间,在构造b
之后但在构造Foo
完成之前的某个时刻抛出异常,则可以将其销毁。
不幸的是,即使您的代码没有任何可能的例外,这条规则仍然有效。 你将不得不重新设计你的类布局,这样单例就不会直接作为其他类的数据成员包含在内,即使它们也是单例。
参考:
C++17 [class.base.init]/12:
在非委托构造函数中,可能会调用每个可能构造的类类型子对象的析构函数。 [注意:该条款确保在抛出异常的情况下可以为完全构造的子对象调用析构函数(18.2)。 ——尾注]
还有 [class.dtor]/12.4:
如果可能调用的析构函数被删除或无法从调用上下文访问,则程序格式错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.