2015-05-07 39 views
5

隨着C++ 11的推出,trivially copyableness已經非常相關。最值得注意的是使用'std :: atomic'。基礎很簡單。一類是foo平凡可複製,如果:哪些規則決定一個對象是否可微複製

​​

具有同樣的效果:

foo* src = new foo(); 
foo* dest = new foo(src); 

的對象,以便在那裏複製內存將有一個拷貝構造函數相同的效果。但是,這當然是一個問題。不僅有複製構造函數。但也移動構造函數,移動賦值運算符。等

std::is_trivially_copyable可以用來測試一個對象是否可以複製。因此,通過試驗和錯誤,可以使對象可複製。

但是,當然一套明確定義的規則會更好一點:)。所以特此請求。

回答

10

最明確的一組規則將直接來自標準。下面是從標準N4296草案的相關條目:

中平凡-能夠複製類型在[basic.types]/9

CV-不合格標量類型定義,能夠複製平凡類類型,的這樣的陣列類型和非易失性 這些類型的const限定版本統稱爲可複製的類型。

中平凡-能夠複製類在[類]/6

甲平凡能夠複製類是一類定義爲:不具有非平凡的拷貝構造函數,不具有非平凡的移動構造,沒有非平凡的複製賦值操作符,沒有不平凡的移動賦值操作符,並且具有微不足道的析構函數。

[class.copy]/12

類X A複製/移動的構造是微不足道的,如果它不是用戶提供的,其參數類型列表複製/移動的構造相當於隱式聲明的參數類型列表,並且如果類X沒有虛擬函數並且沒有虛擬基類,並且類X沒有非揮發性限定類型的非靜態數據成員,並且選擇要複製的構造函數/移動每個直接的基類子對象是微不足道的,並且對於具有類類型(或其數組)的X的每個非靜態數據成員,構造函數選擇 複製/移動該成員是微不足道的;否則複製/移動構造函數是不平凡的。

複製/移動賦值運算符[class。複製]/25

類X A複製/移動的賦值運算符是微不足道的,如果它不是用戶提供的,其參數類型列表相當於一個隱式聲明的參數類型列表,並且如果類X沒有虛擬函數並且沒有虛擬基類,並且類X沒有非揮發性限定類型的非靜態數據成員,並且選擇複製/移動每個直接基類子對象的賦值運算符是微不足道的,並且對於每個屬於類類型(或其數組)的X的非靜態數據成員,被選擇複製/移動該成員的賦值運算符 是微不足道的; 否則複製/移動賦值運算符是非平凡的。

析構函數在[class.dtor]/5

析構函數是平凡的,如果它不是用戶提供的,並且如果:析構函數不是虛擬的,所有的直接基類的它的類具有簡單的析構函數,對於類的所有非靜態數據成員都是類類型(或其數組),每個類都有一個簡單的析構函數。否則,析構函數是不平凡的。在[dcl.fct.def.default]/5

顯式默認的功能和隱式地聲明的函數

用戶提供的構造統稱違約的功能, 和執行應爲它們提供了隱含的定義(12.1 12.4,12.8),這可能意味着將它們定義爲刪除。一個函數是用戶提供的,如果它是用戶聲明的並且沒有明確默認或者在其第一個聲明中被刪除。用戶提供的明確默認功能(即在其第一次聲明後顯式默認)在其明確默認的位置定義;如果這樣的功能被隱含地定義爲被刪除,則該程序是格式不正確的。

簡短的回答是,簡答題有時比長答案更有幫助。

相關問題