2014-03-19 37 views
2

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

按照我的理解,在平凡的可複製類是可以通過按位拷貝複製。 那麼什麼是直覺和理由要求瑣碎的析構函數這是無關的按位複製。

+0

至少有一點是'虛擬析構函數' – billz

回答

3

原因很簡單。可以複製的意思是指將一個對象A複製到另一個對象B的頂部是有效且已定義的行爲。顯然B的析構函數不會被調用,因此它必須是微不足道的。

有一個N3797 3.8/4的對象生命週期的描述,似乎涵蓋了這種情況。然而,如果程序不依賴於析構函數的副作用,那麼在重用存儲和非調用析構函數時可能存在漏洞。

0

一個非平凡的析構函數可能意味着你正在刪除一些指針。 如果出現這種情況,似乎很容易出錯,因爲您會有兩個實例都嘗試刪除相同的指針。

這只是一個猜測,儘管

+0

但是,您也可以在按位複製之後,在其他成員函數而不是析構函數中刪除它。要求不重要的析構函數不能解決此問題。 – ZijingWu

0

在C++對象模型中,滿足Trivially Copyable概念的類型在邏輯上是數據只是一個位塊。該類型只是具有某個值的基本數據對象的集合。因此,將一塊數據複製到某個存儲器是非常有效的操作,並且該存儲器應該(如果適當地對齊)現在包含這樣的對象。此外,將一塊數據塊複製到臨時存儲器(不管對齊方式如何),然後將其複製回適當類型的對象是完全合理的。

C++允許所有這些爲Trivially可複製類型。

如果一個類型真的只是一塊塊......爲什麼它的銷燬不僅僅涉及內存釋放?或者更重要的是,如果它的銷燬確實需要做更多的事情而不是釋放內存,那麼真的是只是一塊比特?

C++的答案是否定的,不是。或者說,我們不能證明,它不只是一塊比特。

這就是關於微不足道可複製性規則的事情:它都是關於證明。根據微不足道的可複製性規則,我們可以證明這種類型只是一個比特塊。其他類型可能是位塊,具體取決於這些功能的功能。但是,既然我們無法證明他們是不是,我們因此禁止他們這樣對待他們。

相關問題