簡體   English   中英

為什么一個類是std :: is_trivially_copyable而不是std :: is_trivially_copy_constructible可以用於memcpy

[英]Why has a class to be std::is_trivially_copyable and not std::is_trivially_copy_constructible to be useable with memcpy

根據各種來源(例如cppreference.com ),一個類必須可以輕松復制才能與memcpy一起使用,但我不明白為什么一個簡單的復制可構造類是不夠的。 只要我確保析構函數被調用適當的時間,簡單的可復制類(如一個簡單的析構函數)的額外屬性應該無關緊要。

任何人都可以提供一個例子或解釋,當在一個類上使用memcpy時,例如一個非平凡的析構函數(或移動構造函數)會導致問題嗎?

只要我確保析構函數被調用適當的時間,簡單的可復制類(如一個簡單的析構函數)的額外屬性應該無關緊要。

那是一個很大的“如果”,不是嗎? 這些規則旨在保護您不要調用UB,如果按位復制需要非平凡破壞的對象是合法的,這將非常容易。 然后......那個非平凡的析構函數做了什么? delete現在共享的資源? 這只是乞求三個規則的問題。

如果要復制資源管理一個復雜的對象,你真的應該被正確拷貝它,使用拷貝構造函數。 std::memcpy是為了向后兼容,並且只應與沒有其他對象來管理的對象一起使用。 因為瘋狂就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM