问题
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?)
回答1:
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.
回答2:
For POD types new T() is value-initialization(will value-initialize all members) ,and new T will not initialize the members (default-initialization). For differences between different forms of initialization see this question. Bottom line: you need is_pod.
来源:https://stackoverflow.com/questions/6496545/trivial-vs-standard-layout-vs-pod