琐碎与标准的布局与POD
用通俗的话来说,平凡的types,标准的布局types和POD有什么区别?
具体来说,我想确定new T
是否与任何模板参数T
new T()
不同。 我应该select哪种types的特征is_trivial
, is_standard_layout
和is_pod
?
(作为一个侧面的问题,这些types的特性中的任何一个都可以在没有编译器的情况下实现?
我不认为这可以用真正的外行人的话来说,至less没有太多额外的解释。 重要的一点是静态初始化和dynamic初始化,但是对外行来说,本身就是几页。
在C ++ 98中定义了POD(错误)。 实际上有两个独立的意图,既不表示得很好:1)如果你在C ++中编译一个C结构声明,你得到的结果应该等同于你在C中的结果。2)一个POD将只需要/使用static (不dynamic)初始化。
C ++ 0x / 11完全抛弃了“POD”的称号,而是倾向于“微不足道”和“标准布局”。 标准布局旨在捕获第一个意图 – 使用与您在C中获得的布局相同的方式创build某些内容。Trivial旨在捕获对静态初始化的支持。
由于new T
对new T()
处理初始化,你可能想要is_trivial
。
我不确定需要编译器魔法。 我的直接反应可能是肯定的,但是知道人们用TMP做的一些事情,我很难确定有人不能这样做。
编辑:例如,也许最好引用N3290的例子:
struct N { // neither trivial nor standard-layout int i; int j; virtual ~N(); }; struct T { // trivial but not standard-layout int i; private: int j; }; struct SL { // standard-layout but not trivial int i; int j; ~SL(); }; struct POD { // both trivial and standard-layout int i; int j; };
正如你可以毫无疑问猜测的那样, POD
也是一个POD结构。
对于PODtypes, new T()
是值初始化(将初始化所有成员), new T
不会初始化成员(默认初始化)。 对于不同forms的初始化之间的差异看到这个问题 。 底线:你需要is_pod
。