std::is_trivially_copyable 有一個演示代碼 https://en.cppreference.com/w/cpp/types/is_trivially_copyable
void test()
{
struct A {
int m;
A(const A& o):m(o.m){}
};
struct D {
int m;
D(D const&) = default; // -> trivially copyable
D(int x) : m(x 1) {}
};
std::cout << std::is_trivially_copyable<A>::value << '\n';
std::cout << std::is_trivially_copyable<D>::value << '\n';
}
A 是不可復制的,D 可以。我使用默認行為實作了 A 的復制建構式。造成差異的原因是什么?
uj5u.com熱心網友回復:
這就是它在 C 中的定義:https : //en.cppreference.com/w/cpp/language/copy_constructor#Trivial_copy_constructor
平凡的復制建構式如果以下所有條件都為真,則類 T 的復制建構式是平凡的:
- 它不是用戶提供的(也就是說,它是隱式定義的或默認的);
- T 沒有虛成員函式;
- T 沒有虛擬基類;
- 為 T 的每個直接基選擇的復制建構式是微不足道的;
- 為 T 的每個非靜態型別別(或型別別陣列)成員選擇的復制建構式是微不足道的;
非聯合類的普通復制建構式有效地復制引數的每個標量子物件(包括遞回地,子物件的子物件等)并且不執行其他操作。但是,不需要復制填充位元組,即使復制的子物件的物件表示也不需要相同,只要它們的值相同即可。
TriviallyCopyable 物件可以通過手動復制它們的物件表示來復制,例如使用 std::memmove。所有與 C 語言兼容的資料型別(POD 型別)都可以輕松復制。
uj5u.com熱心網友回復:
這不是微不足道的,因為它是用戶定義的。這就是規則。
編譯器不需要確定您的代碼是否與生成的代碼相同。那是你要弄清楚的作業。:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385151.html
上一篇:std::tuple的笛卡爾積
下一篇:類方法的內容由模板值決定
