Подтвердить что ты не робот

Тривиальный или стандартный макет против POD

В условиях неспециалиста, какая разница между тривиальными типами, стандартными типами макета и POD?

В частности, я хочу определить, отличается ли new T от new T() для любого параметра шаблона T. Какую из характеристик типа is_trivial, is_standard_layout и is_pod выбрать?

(В качестве побочного вопроса можно ли реализовать любую из этих черт этого типа без магии компилятора?)

4b9b3361

Ответ 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.

Ответ 2

Для типов POD new T() - инициализация значений (будет инициализировать значение всех членов), а new T не будет инициализировать элементы (инициализация по умолчанию). Для различий между различными формами инициализации см. Этот вопрос. Итог: вам нужно is_pod.