为什么平凡的可复制类要求析构函数必须是平凡的 基于C++标准。普通可复制类的定义如下:

为什么平凡的可复制类要求析构函数必须是平凡的 基于C++标准。普通可复制类的定义如下:,c++,language-lawyer,C++,Language Lawyer,根据九五, A trivially copyable class is a class that: - has no non-trivial copy constructors (12.8), - has no non-trivial move constructors (12.8), - has no non-trivial copy assignment operators (13.5.3, 12.8), - has no non-trivial move assignment operat

根据九五,

A trivially copyable class is a class that:
- has no non-trivial copy constructors (12.8),
- has no non-trivial move constructors (12.8),
- has no non-trivial copy assignment operators (13.5.3, 12.8),
- has no non-trivial move assignment operators (13.5.3, 12.8), and
- has a trivial destructor (12.4).
据我所知,普通可复制类可以通过按位复制进行复制。
那么,需要与按位复制无关的平凡析构函数的直觉和理由是什么呢。

一个非平凡析构函数可能意味着删除了一些指针。 如果是这种情况,那么对类进行按位复制似乎很容易出错,因为这样会有两个实例同时尝试删除同一指针


这只是一个猜测,原因很简单。普通可复制意味着将一个对象A复制到另一个对象B的顶部是有效且定义的行为。显然,不会调用B的析构函数,因此它必须是普通的


N3797 3.8/4中有对象生存期的描述,似乎涵盖了这种情况。但是,如果不依赖于析构函数的副作用,就可能存在一个关于非重复析构函数的存储和非调用的漏洞。在C++对象模型中,满足平凡可复制概念的类型在逻辑上是一个数据只是一个比特块的类型。该类型只是具有某些值的基本数据对象的集合。因此,将一块位复制到某个存储器是一个完全有效的操作,并且该存储器(如果适当对齐)现在应该包含这样一个对象。此外,将一块位复制到某个临时存储器(不管对齐方式如何)然后将其复制回适当类型的对象中是完全合理的

C++允许对可复制的类型执行所有这些操作

如果一个类型真的只是一块位。。。为什么它的破坏不仅仅是内存释放?或者更重要的是,如果它的销毁需要做的不仅仅是释放内存,那么它真的只是一块位吗

C++的答案是不,不是。或者更确切地说,我们无法证明它不仅仅是一块比特


这就是琐碎的可复制性规则:这都是关于证据的。在平凡的可复制性规则下,我们可以证明这样的类型只是一个比特块。其他类型可能是位块,具体取决于这些函数的功能。但是,由于我们无法证明它们是否是,因此我们禁止将它们视为虚拟析构函数。

至少有一点是
虚拟析构函数
,但您也可以在按位复制后在其他成员函数中删除它,而不是在析构函数中删除它。要求非平凡析构函数无法解决此问题。