тривиальный или стандартный макет против POD - PullRequest
65 голосов
/ 27 июня 2011

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

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

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

Ответы [ 2 ]

56 голосов
/ 27 июня 2011

Я не думаю, что это можно сделать с точки зрения непрофессионала, по крайней мере, без лота дополнительных объяснений.Одним из важных моментов является статическая и динамическая инициализация, но объясняется, что для неспециалистов было бы несколько страниц само по себе ...

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.

7 голосов
/ 27 июня 2011

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

...