簡體   English   中英

std :: is_trivially_copyable要求

[英]std::is_trivially_copyable requirements

c ++標准(和幾個SO 答案 )指出,要符合is_trivially_copyable<T> ,類型T必須具有:

  1. 默認的析構函數
  2. 沒有虛擬功能,
  3. 沒有虛擬基類。

(這些不是唯一的要求,但是問題只針對這些要求)

有人可以解釋為什么嗎? 我看不到違反這3個因素如何使T數組對memcpy不安全。

關於1(“默認析構函數”),僅是因為將新對象的memcpy轉換為現有變量不會調用其覆蓋的析構函數,因此,如果類依賴於該析構函數中的任何內容,則其約束可能是侵犯。

對於2(“無虛函數”),可能的原因是當發生對象切片時,切片的對象必須正確地充當基類對象。

想象一下這樣的基類和派生類:

class Base {
    int b;
    virtual void f() { ++b; }
}

class Derived : public Base {
    int d;
    void f() override { ++d; }
}

現在假設您有一個Base&變量v ,它實際上引用了Derived對象。 如果std::is_trivially_copyable<Base>為true,則可以將此變量從memcpy轉移到另一個Base對象w (這將復制bvtable )。 如果現在要調用wf() ,則可以(通過vtable)調用Derived::f() 當然,哪一個是不確定的,因為wd沒有分配存儲空間。

這可能也占了3個(“沒有虛擬基類”),但是由於我幾乎從不使用虛擬基類,因此我會請更熟悉它們的人。

暫無
暫無

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

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