fre*_*low 69 c++ constructor initialization pod type-traits
通俗地说,琐碎类型,标准布局类型和POD之间有什么区别?
具体来说,我想确定是否new T与new 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 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;
};
Run Code Online (Sandbox Code Playgroud)
你无疑可以猜测,POD也是一个POD结构.