我可以存储C ++ 11中具有Standard Layout兼容类的对象数据吗?

时间:2018-10-18 09:56:06

标签: c++ c++11

带有C ++ 11草案的文档中的3.9.2节:

(文档编号N3242 = 11-0012,日期:2011-02-28,修订:N3225,名称:工作草案,编程语言C ++标准) 有人说:

  

对于任何对象(除基类子对象之外)   复制”类型T,对象是否持有有效值   类型T,可以复制组成对象的基础字节(1.7)   放入char或unsigned char数组中。

我找不到有关可以对具有标准布局类型的对象执行类似操作的任何信息。

对类型为标准布局类型的对象进行此类操作合法吗?

实际上,如果 std::is_standard_layout<T>::value为真,则我(可能)可以安全地将对象存储在辅助内存中,该内存是无符号字符数组。


p.s。引用

我知道,由于Stackoverlow的政策,用户可能会被阻止,但他们正在提供问题中的链接,但这只是为了使读者感到舒适。如果链接从5年后将中断,请使用另一种方法查找提到的文档。

[1] C ++标准委员会-ISOCPP的C ++标准草案: http://www.open-std.org/jtc1/sc22/wg21/docs/standards

[2] C ++ 2011标准草案: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

1 个答案:

答案 0 :(得分:3)

不,除非您最终要获得带有不变变量的对象,否则您将无法。

很容易将标准布局类型转换为不可复制的类型,这很容易做到:

struct A {
    A & operator=(A) {
        std::terminate();
    }
};

static_assert(    std::is_standard_layout   <A>::value, "");
static_assert(not std::is_trivially_copyable<A>::value, "");

如果使用std::memcpy复制对象,则不会调用复制分配运算符,并且程序将继续。如果正常复制,程序将停止。这表明std::memcpy不遵守类型设置的规则。

这是一个有问题的典型示例:考虑一个对象,该对象持有在析构函数中释放的指针。如果使用std::memcpy复制它,则将复制指针,并且在析构函数运行时,您将获得双倍的空闲空间。