【发布时间】:2014-06-08 04:36:04
【问题描述】:
我有这样的课:
片段 1:
struct B
{
int member;
// more complex members e.g. arrays of structs etc
};
这个类在代码中使用,假设它是一个 C 风格的结构(例如,用于 memcpy、memset 等)
作为良好编程原则的一部分,我正在考虑像这样修改 B:
片段 2
struct B
{
B() {}
int member;
// more complex members e.g. arrays of structs etc
};
这是我的理解。如果我错了,请纠正 一种。 Snippet 1 定义 B,它是 POD,而 Snippet 2 定义 B,它不是 POD,并且 湾。在 Snippet 2 中,B 仍然可以合法地用于 C 风格的用途,例如 memset 和 memcpy
- std::is_pod : 假
- std::is_trivial : 假
- std::is_trivially_copyable : 真
- std::is_trivial : 假
扩展,我也会遵循Big 3(或者Big 5)的规则,我会添加复制赋值以及复制构造函数。
片段 3:
struct B
{
B() {}
~B(){}
B& operator=(B &){ return *this; }
B(B const &r){}
int member;
// more complex members e.g. arrays of structs etc
};
这是我的理解。如果我错了,请纠正 一种。在 Snippet 3 中,B 现在不能再合法地用于 C 风格的用途,例如 memset 和 memcpy
- std::is_pod : 假
- std::is_trivial : 假
- std::is_trivially_copyable : 假
- std::is_trivial : 假
我需要了解在 Snippet 2 和 Snippet 3 中向 B 添加各种成员对 B 的 C 样式使用的影响。
类的 C 风格使用真的是基于 is_trivially_copyable 还是基于 is_trivial(限制性更强)?
阅读 $3.9/2 向我表明,在 C++11 中,“is_trivially_copyable” 确实是决定标准。一些旧的 C++ 书籍(例如 C++)表明标准是关于 POD 与非 POD 的,我知道 C++11 规则从那以后发生了变化。
Petes 的回复似乎表明琐碎是必要的标准
【问题讨论】:
-
“$3.9/2”是什么意思?
-
@Dennis 第 3.9 节,ISO C++11 标准的第 2 段。