平凡vs.标准布局vs. POD [英] trivial vs. standard layout vs. POD

查看:247
本文介绍了平凡vs.标准布局vs. POD的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



具体来说,我想确定 new T是什么?对于任何模板参数 T 不同于 new T()。哪个类型特征 is_trivial is_standard_layout is_pod 我选择?



(作为一个侧面的问题,这些类型traits是否可以没有编译器魔法?)

解决方案

我不认为它可以用真正的外行人的术语,至少没有一个很多额外的解释。一个重要的点是静态和动态初始化,但解释说,对一个外行人本身将是几个页面...



PODs(mis-) +98。实际上有两个单独的意图,没有表示得很好:1)如果你在C ++中编译一个C结构声明,你得到的应该是等同于你在C中。2)POD只会需要/使用静态(非动态)初始化。



C ++ 0x / 11完全丢弃了POD的名称,赞成琐碎和标准布局。标准布局旨在捕获第一个意图 - 使用与在C中获得的布局相同的布局创建一个。Trivial旨在捕获对静态初始化的支持。



由于新T 新T()处理初始化,您可能 is_trivial



我不确定需要编译器魔法。我立即的反应可能是肯定的,但是知道一些人们用TMP做的事情,我很难确定有人不能这样做。



Edit:例如,最好只是引用N3290的例子:

  struct N {//既不简单也不standard-layout 
int i;
int j;
virtual〜N();
};

struct T {//简单但不是标准布局
int i;
private:
int j;
};

struct SL {//标准布局但不重要
int i;
int j;
〜SL();
};

struct POD {//简单和标准布局
int i;
int j;
};

无疑是猜测, POD 也是POD结构。


In layman's terms, what's the difference between trivial types, standard layout types and PODs?

Specifically, I want to determine whether new T is different from new T() for any template parameter T. Which of the type traits is_trivial, is_standard_layout and is_pod should I choose?

(As a side question, can any of these type traits be implemented without compiler magic?)

解决方案

I don't think it can be done in truly layman's terms, at least without a lot of extra explanation. One important point is static vs. dynamic initialization, but explaining that to a layman would be several pages in itself...

PODs were (mis-)defined in C++98. There are really two separate intents involved, neither expressed very well: 1) that if you compile a C struct declaration in C++, what you get should be equivalent to what you had in C. 2) A POD will only ever need/use static (not dynamic) initialization.

C++0x/11 drops the "POD" designation (almost) entirely, in favor of "trivial" and "standard layout". Standard layout is intended to capture the first intent -- creating something with a layout the same as you'd get in C. Trivial is intended to capture the support for static initialization.

Since new T vs. new T() deals with initialization, you probably want is_trivial.

I'm not sure about compiler magic being required. My immediate reaction would be probably yes, but knowing some of the things people have done with TMP, I have a hard time being certain somebody couldn't do this too...

Edit: for examples, perhaps it's best to just quote the examples from 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;
};

As you can undoubtedly guess, POD is also a POD struct.

这篇关于平凡vs.标准布局vs. POD的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆