![](/img/trans.png)
[英]Why has a class to be std::is_trivially_copyable and not std::is_trivially_copy_constructible to be useable with memcpy
[英]What is the difference between is_trivially_copyable and is_trivially_copy_constructible?
什么時候會給出不同的答案,這種差異什么時候會有用呢?
前者測試了一個簡單的可復制屬性,用少數幾個詞來表示類型是memcpy
-safe。
一個簡單的可復制類是一個類:
- 沒有非平凡的拷貝構造函數(12.8),
- 沒有非平凡的移動構造函數(12.8),
- 沒有非平凡的副本賦值運算符(13.5.3,12.8),
- 沒有非平凡的移動賦值運算符(13.5.3,12.8),和
- 有一個簡單的析構函數(12.4)。
一個普通的類是一個具有普通默認構造函數(12.1)並且可以輕易復制的類。
[ 注意:特別是,一個簡單的可復制或普通的類沒有虛函數或虛基類。 - 尾注 ]
后者測試是否存在一個普通的拷貝構造函數 ,順便說一句,這是一個簡單的可復制屬性的要求。 它基本上意味着該類型的復制構造函數執行按位復制。
如果不是用戶提供的,則類X的復制/移動構造函數是微不足道的
- 類X沒有虛函數(10.3),沒有虛基類(10.1),和
- 選擇復制/移動每個直接基類子對象的構造函數是微不足道的,並且
- 對於類類型(或其數組)的X的每個非靜態數據成員,選擇復制/移動該成員的構造函數是微不足道的;
否則復制/移動構造函數是非平凡的。
很容易制作一種為這些特征提供不同結果的類型:
struct foo {
foo(foo const&) = default; // this is a trivial copy constructor
~foo(); // this is a non-trivial destructor
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.