通俗地说,普通类型、标准布局类型和 POD 之间有什么区别?
具体来说,我想确定是否new T
不同于new T()
对于任何模板参数T
。属于哪一类特征is_trivial
, is_standard_layout
and is_pod
我应该选择吗?
(作为一个附带问题,这些类型特征中的任何一个都可以在没有编译器魔法的情况下实现吗?)
我认为这不能用真正的外行术语来完成,至少在没有lot的额外解释。一个重要的一点是静态初始化与动态初始化,但向外行人解释这一点本身就需要好几页……
POD 在 C++98 中被(错误)定义。实际上涉及两个不同的意图,但都没有很好地表达:1)如果你在 C++ 中编译 C 结构声明,你得到的应该与你在 C 中得到的相同。2)POD 只需要/使用 static (非动态)初始化。
C++0x/11(几乎)完全放弃了“POD”名称,转而支持“琐碎”和“标准布局”。标准布局旨在捕获第一个意图 - 创建具有与 C 中相同的布局的东西。Trivial 旨在捕获对静态初始化的支持。
Since new T
vs. new T()
处理初始化,你probably want 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 结构体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)