[英]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.