琐碎与标准的布局与POD

用通俗的话来说,平凡的types,标准的布局types和POD有什么区别?

具体来说,我想确定new T是否与任何模板参数T new T()不同。 我应该select哪种types的特征is_trivialis_standard_layoutis_pod

(作为一个侧面的问题,这些types的特性中的任何一个都可以在没有编译器的情况下实现?

我不认为这可以用真正的外行人的话来说,至less没有太多额外的解释。 重要的一点是静态初始化和dynamic初始化,但是对外行来说,本身就是几页。

在C ++ 98中定义了POD(错误)。 实际上有两个独立的意图,既不表示得很好:1)如果你在C ++中编译一个C结构声明,你得到的结果应该等同于你在C中的结果。2)一个POD将只需要/使用static (不dynamic)初始化。

C ++ 0x / 11完全抛弃了“POD”的称号,而是倾向于“微不足道”和“标准布局”。 标准布局旨在捕获第一个意图 – 使用与您在C中获得的布局相同的方式创build某些内容。Trivial旨在捕获对静态初始化的支持。

由于new Tnew 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