C++保证和POD类数据的名称,具有memcpy功能

edA*_*a-y 17 c++ c++11

在另一个问题中,我错误地使用术语POD来指代实际上不是POD类型的数据类型(由于具有构造函数).现在,我已经查看了标准,找不到我想要的正确名称.我实际上也无法保证实际允许复制.

我所说的数据类型是POD,但可能包含函数,包括构造函数,但与等效的POD类型相比,不应改变其对齐或大小特征.

在标准的3.9节中,它指出POD数据可以用memcpy复制到另一个对象,或者复制到字符数据和后面.没有这种非POD数据的保证.

但是,对象的对象表示在同一部分中定义.它被定义为可以相信任何两个相同类型的对象可以通过memcpy安全地复制.

所以我的问题是:

  1. 具有memcpy的副本实际上是否保证对这些对象是安全的?
  2. 如果是,那么为什么有关于memcpy和POD的特别说明?
  3. 这种类型的数据是否有memcpy安全的名称?

我所说的对象类型的一个简单示例:

struct ex_struct
{
  int a,b,c,d;
  ex_struct() : a(123) { }
}
Run Code Online (Sandbox Code Playgroud)

阅读C++ 0x草案,我的结构似乎是一个简单的可复制类(9.1).我相信这意味着memcpy是安全的.

Ben*_*igt 7

在C++ 0x中,PODness的概念被分解为几个单独有用的类别:

一个简单的可复制类是一个类(草案3242,部分[class]):

  • 没有非平凡的复制构造函数(12.8),
  • 没有非平凡的移动构造函数(12.8),
  • 没有非平凡的副本赋值运算符(13.5.3,12.8),
  • 没有非平凡的移动赋值运算符(13.5.3,12.8),和
  • 有一个简单的析构函数(12.4).

一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类.

[ 注意: 特别是,一个简单的可复制或普通的类没有虚函数或虚基类.- 结束说明 ]

一个标准布局类是一类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数(10.3),也没有虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,
  • 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类.

对于简单的构造函数,赋值运算符和析构函数的要求分散在第12节"特殊成员函数"中[special].

  • 所以我的结构是*可以复制*,这意味着我可以使用*memcpy*.这也意味着如果我从这样的类派生,我仍然可以保持*平凡可复制*只要我的派生类也可以. (2认同)