为什么琐碎的可复制类需要析构函数必须是微不足道的

时间:2014-03-19 01:15:15

标签: c++ language-lawyer

基于C ++标准。 普通的可复制类定义如下:

根据9/5,

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).

根据我的理解,平易可复制的类可以通过按位复制来复制。 那么需要普通析构函数的直觉和理由是什么,它与按位副本无关。

3 个答案:

答案 0 :(得分:3)

原因很简单。平凡的可复制意味着将一个对象A复制到另一个B的顶部是有效且定义的行为。显然,B的析构函数不会被调用,所以它必须是微不足道的。

N3797 3.8 / 4中有对象寿命的描述,这似乎涵盖了这种情况。但是,如果程序不依赖于析构函数的副作用,则可能存在关于重用存储和非调用非平凡析构函数的漏洞。

答案 1 :(得分:0)

一个非平凡的析构函数可能意味着你正在删除一些指针。 如果是这种情况,那么看起来很容易做一个类的按位复制,因为你有两个实例都试图删除相同的指针。

这只是一个猜测

答案 2 :(得分:0)

在C ++对象模型中,满足Trivially Copyable概念的类型在逻辑上是一个人的数据只是一个比特块。该类型只是具有一些值的基础数据对象的集合。因此,将位块复制到某个存储器是完全有效的操作,并且该存储应该(如果适当地对齐)现在包含这样的对象。此外,将一个位块复制到某个临时存储器(无论是否对齐),然后将其复制回适当类型的对象,这是完全合理的。

C ++允许所有这些用于Trivially Copyable类型。

如果一个类型真的只是一个比特块...为什么它的破坏只涉及内存释放?或者更重要的是,如果它的破坏确实需要做的不仅仅是解除分配内存,那么真的只是一块位吗?

C ++的答案是否定的,但事实并非如此。或者说,我们不能证明它不仅仅是一个比特块。

关于琐碎可复制性规则的事情:它都是关于证据的。在普通的可复制性规则下,我们可以证明这样的类型只是一个比特块。其他类型可能是位块,具体取决于这些函数的作用。但由于我们无法证明它们是否存在,因此我们禁止对它们进行处理。