在另一个问题中,我错误地使用术语POD来指代实际上不是POD类型的数据类型(由于具有构造函数).现在,我已经查看了标准,找不到我想要的正确名称.我实际上也无法保证实际允许复制.
我所说的数据类型是POD,但可能包含函数,包括构造函数,但与等效的POD类型相比,不应改变其对齐或大小特征.
在标准的3.9节中,它指出POD数据可以用memcpy复制到另一个对象,或者复制到字符数据和后面.没有这种非POD数据的保证.
但是,对象的对象表示在同一部分中定义.它被定义为可以相信任何两个相同类型的对象可以通过memcpy安全地复制.
所以我的问题是:
我所说的对象类型的一个简单示例:
struct ex_struct
{
int a,b,c,d;
ex_struct() : a(123) { }
}
Run Code Online (Sandbox Code Playgroud)
阅读C++ 0x草案,我的结构似乎是一个简单的可复制类(9.1).我相信这意味着memcpy是安全的.
在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].
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |