- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据我对标准的理解,普通析构函数是一种隐式声明的析构函数,其类只有基本和非静态成员以及普通析构函数。鉴于此定义的递归性,在我看来,唯一的“递归停止”条件是找到具有非隐式声明的析构函数(即用户声明的)的基类或非静态成员。如果那是对的,那应该意味着一个普通的析构函数是一个“不需要做任何事情”的析构函数,因此它将被声明(隐式地)但不被定义。换句话说:根据标准定义,隐式定义析构函数(即“它做某事”)不能是微不足道的说法是否正确?
很抱歉提出这种愚蠢的问题,但我想澄清一下我的想法......
最佳答案
没有。隐式定义的平凡析构函数根据定义是平凡的:) declare 和 define thingy 之间的区别在于,为了让编译器甚至看到析构函数可用,必须始终有一个声明。因此,如果您不提供,它会隐式提供一个。
但是现在,如果需要(如果该类类型的对象被销毁),它还会定义一个。在任何情况下,它都必须做一些事情:它需要调用其所有成员和基类的析构函数。一个简单的例子来说明隐式定义析构函数的效果:
struct a {
private:
~a();
};
struct bug {
// note: can't be destructed
a a_;
};
一旦您尝试创建 bug 的本地对象,编译器就会发出错误信号,因为它会生成 bug 的析构函数定义,它会尝试调用 a 的不可访问的析构函数。
现在,我认为析构函数/构造函数的琐碎性主要用于对您的程序施加约束。例如,具有非平凡版本的对象不能放在 union 中。另一方面,您可以删除具有不完整类型的对象,前提是它具有平凡的析构函数。请注意,如果您的程序无法确定是否实际定义了平凡的析构函数,则允许编译器省略对它的定义。这就是所谓的 as-if
规则。编译器必须表现得好像它是标准兼容的——优化并不重要,只要它们不改变程序的含义。
关于c++ - 析构函数 : triviality vs implicit definition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/442784/
我是一名优秀的程序员,十分优秀!