平凡与标准布局与POD

fre*_*low 69 c++ constructor initialization pod type-traits

通俗地说,琐碎类型,标准布局类型和POD之间有什么区别?

具体来说,我想确定是否new Tnew T()任何模板参数不同T.哪种类型的性状is_trivial,is_standard_layout而且is_pod我应该选择?

(作为一个附带问题,可以在没有编译器魔法的情况下实现任何这些类型特征吗?)

Jer*_*fin 60

我不认为它可以用真正的外行人的术语来完成,至少没有太多额外的解释.一个重要的点是静态与动态初始化,但向外行解释这本身就是几页......

POD是在C++ 98中定义的(错误).实际上有两个单独的意图,都没有表达得很好:1)如果你在C++中编译一个C结构声明,你得到的应该与你在C中的相同.2)POD只需要/使用静态(不是动态的)初始化.

C++ 0x/11完全删除了"POD"(几乎)的名称,支持"普通"和"标准布局".标准布局旨在捕获第一个意图 - 创建具有与C中相同布局的内容.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;
};
Run Code Online (Sandbox Code Playgroud)

你无疑可以猜测,POD也是一个POD结构.


Arm*_*yan 8

对于POD类型new T()是值初始化(将对所有成员进行值初始化),并且new T不会初始化成员(默认初始化).对于不同形式的初始化之间的差异看这个问题.底线:你需要is_pod.