[英]std::is_trivially_copyable requirements
關於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
(這將復制b
和vtable
)。 如果現在要調用wf()
,則可以(通過vtable)調用Derived::f()
。 當然,哪一個是不確定的,因為wd
沒有分配存儲空間。
這可能也占了3個(“沒有虛擬基類”),但是由於我幾乎從不使用虛擬基類,因此我會請更熟悉它們的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.