【发布时间】:2012-02-25 17:59:59
【问题描述】:
Comeau、g++ (ideone) 和 EDG 接受以下代码而不进行诊断。 Visual C++ 编译成功,但出现警告 C4624。
class indestructible_base
{
~indestructible_base();
};
class T : indestructible_base
{
public:
//T() {}
};
int main(void) { new T(); }
取消注释构造函数,它不再编译。
也许这是规则,如果构造函数内部发生异常,则必须销毁子对象?看起来很奇怪,因为主体是空的并且不会导致异常。即便如此,添加一个异常规范以保证不会引发异常(throw() 或 noexcept),这没有任何区别。
为什么用户声明的构造函数需要访问基类析构函数,而自动生成的构造函数不需要?
【问题讨论】:
-
FWIW,Clang 在 C++0x 模式下的两种情况下都拒绝程序,但在 c++98 模式下的行为类似于 g++。
-
当你将 ~indestructible_base() 声明为 public 时,编译器不会抱怨。
-
这可能与异常有关。如果有用户定义的构造函数,则不能保证它不会抛出。如果它抛出,则需要销毁基础子对象。但我可能错了。 - 如果你有一个非平凡的成员,例如 std::string,即使没有用户定义的构造函数,它也不会编译。 (同样,这可能会抛出编译器生成的构造函数。)
-
绝对是错误的标签:可访问性这不是。
-
@Norman:抱歉,正确的标签是
access-modifiers。
标签: c++ inheritance destructor access-modifiers language-lawyer