析构函数:琐碎与隐含的定义

abi*_*gli 4 c++ destructor

正如我理解标准一样,一个简单的析构函数是一个隐式声明的析构函数,它的类只有基本和非静态成员和简单的析构函数.鉴于此定义的递归性,在我看来,唯一的"递归停止"条件是找到具有非隐式声明的析构函数的基础或非静态成员(即用户声明).如果这是正确的,那应该意味着一个简单的析构函数是"不必做任何事情",因此它将被声明(隐式)但没有定义.用另一种方式说:根据标准定义,隐含定义的析构函数(即"它做某事")是不是很简单?

对不起那种愚蠢的问题,但我想在脑海中澄清一些事情......

Joh*_*itb 6

根据定义,隐式定义的,简单的析构函数是微不足道的:) declare和define thingy之间的区别在于,为了让编译器甚至看到析构函数可用,必须始终有一个声明.因此,如果您不提供一个,它将隐式提供一个.

但是现在,它还将定义一个,如果需要的话(如果该类类型的对象被销毁).无论如何,它必须做一些事情:它需要调用其所有成员和基类的析构函数.一个简单的例子,说明了隐式定义析构函数的效果:

struct a {
private:
    ~a();
};

struct bug {
    // note: can't be destructed
    a a_;
};
Run Code Online (Sandbox Code Playgroud)

一旦你尝试创建一个bug的本地对象,编译器就会发出错误信号,因为它会产生一个bug的析构函数定义,它试图调用一个不可访问的析构函数.

现在,我认为破坏者/构造函数的琐碎主要用于对程序施加约束.例如,具有非平凡版本的对象不能放入联合中.另一方面,您可以删除具有不完整类型的对象,前提是它具有普通的析构函数.请注意,如果您的程序无法确定是否实际定义了一个简单的析构函数,则允许编译器省略它的定义.这就是所谓的as-if规则.编译器必须表现为 - 如果它符合标准 - 只要它们不改变程序的含义,优化就无关紧要了.