如果我在堆栈上创建一个对象,它的构造函数将被调用。它的析构函数将在main执行结束时或在超出范围等时被调用。但是当一个对象超出范围时调用析构函数在运行时发生。那么,如果我将析构函数设为私有,为什么它是编译时错误? 根据我的理解,我的期望是应该没有编译时错误,并且在执行期间,对象应该在堆栈上创建而没有任何错误,但是当对象超出范围时应该有一些运行时错误(或崩溃或其他)。为什么不是这种行为?
答案 0 :(得分:4)
可见性是一个编译时功能:您在编译时检查一组约束以确保运行时安全性(在某种程度上)。当程序被编译成发布二进制文件时,所有关于私有/公共内容的信息都将丢失。这些构造可以帮助您编写好的,安全的,可维护的代码,但不能用作运行时错误检查器。
答案 1 :(得分:1)
编译器必须生成代码以调用对象超出范围的析构函数。
可见性在编译时强制执行,因此如果析构函数不可见,编译器需要生成代码来调用它,编译器通常会发出错误消息并拒绝代码。
理论上,标准只需要编译器发出"诊断" (很少定义构成的内容)因此理论上可以设置编译器打印出某种类型的警告,并允许编译完成(并生成代码以调用对象超出范围的析构函数,甚至虽然析构函数不可见,或者可能抛出异常,或者只是它想要的任何东西)。实际上,我无法想象编译器会做这样的事情(将dtor私有化通常专门用于阻止对象被实例化),而且我不知道任何真正的编译器都是这样的。