科莫,g++(ideone http://ideone.com/cBNwr)和 EDG 接受以下代码而不进行诊断。 Visual C++ 编译成功,但出现警告 C4624。
class indestructible_base
{
~indestructible_base();
};
class T : indestructible_base
{
public:
//T() {}
};
int main(void) { new T(); }
取消注释构造函数,它将不再编译。
也许规则是如果构造函数内部发生异常,则必须销毁子对象?看起来很奇怪,因为主体是空的并且不会引起异常。即便如此,请添加一个异常规范,以保证不会抛出异常(throw()
or noexcept
)并且没有什么区别。
为什么用户声明的构造函数需要访问基类析构函数,而自动生成的构造函数不需要?
这个问题的灵感来自于:防止析构函数在 C++ 中运行 https://stackoverflow.com/q/9123022/103167
我怀疑这可能是编译器特定的行为。这是我的理论:
因为(在这种特殊情况下)隐式定义的 T() 是trivial构造函数(如标准 12.1(5) 中定义),编译器甚至不会尝试为 T() 生成主体。由于没有 ctor 主体,因此在“构造”期间不会生成任何异常(实际上没有任何异常),因此不需要生成 dtor 调用,因此不需要生成 dtor 主体,却发现基类的 dtor 是私有的。
但是一旦 T() 变得不平凡(即使它仍然是隐式定义的),就必须生成一个构造函数体,并且您会收到错误。像向具有用户定义构造函数的类 T 添加成员这样简单的事情将使隐式定义的 T() 变得不平凡。
一个单独但相关的问题是new T()
不会生成 dtor 调用(因为您没有相应的delete
任何地方)。相反,如果我只是替换new T()
with T dummy
在你的代码中,然后我得到以下内容gcc
,表明它现在正在对 dtor 可访问性进行全面检查(由于必须生成 dtor 调用):
test.cpp: In destructor 'T::~T()':
test.cpp:3: error: 'indestructible_base::~indestructible_base()' is private
test.cpp:7: error: within this context
test.cpp: In function 'int main()':
test.cpp:12: note: synthesized method 'T::~T()' first required here
test.cpp:12: warning: unused variable 'dummy'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)