繁体   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