Я не думаю, что это можно сделать с точки зрения непрофессионала, по крайней мере, без лота дополнительных объяснений.Одним из важных моментов является статическая и динамическая инициализация, но объясняется, что для неспециалистов было бы несколько страниц само по себе ...
POD были (неправильно) определены в C ++ 98.На самом деле речь идет о двух разных намерениях, и ни одно из них не очень хорошо выражено: 1) что если вы скомпилируете объявление структуры C в C ++, то, что вы получите, должно быть эквивалентно тому, что вы имели в C. 2) POD всегда будет нуждаться / использовать только статический(не динамическая) инициализация.
C ++ 0x / 11 полностью (почти) отбрасывает обозначение «POD» в пользу «тривиального» и «стандартного макета».Стандартный макет предназначен для захвата первого намерения - создание чего-то с макетом, аналогичным тому, который вы получили бы в C. Тривиальный предназначен для захвата поддержки статической инициализации.
С 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;
};
Как вы, несомненно, можете догадаться, POD
также является структурой POD.