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 Tvs.new T()deals with initialization, you probably wantis_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:
As you can undoubtedly guess,
PODis also a POD struct.