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