Является ли тип POD в точности эквивалентным тривиальному типу стандартной компоновки? - PullRequest
19 голосов
/ 08 ноября 2019

В C ++ 20 концепция POD устарела, предположительно потому, что это бессмысленная составная черта тривиальности и стандартной компоновки. Однако определение POD в черновике C ++ 20 не совсем "и тривиально, и стандартно-компоновочно";на самом деле это:

Класс POD - это класс, который является как тривиальным классом, так и классом стандартной компоновки и не имеет нестатических членов-данных типа не-POD класса (или его массива). ). Тип POD - это скалярный тип, класс POD, массив такого типа или cv-квалифицированная версия одного из этих типов.

Другими словами, не только тип PODи тривиальный, и стандартный макет, но также рекурсивный.

Является ли это рекурсивное требование избыточным? Другими словами, если тип является как тривиальным, так и стандартным макетом, будет ли он автоматически рекурсивно тривиальным и стандартным макетом? Если ответ «нет», то каков пример стандартного макета, тривиального типа, который не может быть POD?

Ответы [ 2 ]

10 голосов
/ 08 ноября 2019

В C ++ 20 концепция POD устарела, предположительно потому, что это бессмысленная составная черта тривиальности и стандартного расположения.

Неправильно. Термин POD устарел, потому что он больше не имеет значения :

Термин POD больше не служит цели в стандарте, он просто определен, и ограничения применяются для случаев, когданемногие другие типы сохраняют это рудиментарное свойство.

По сути, тип, который является как тривиальным, так и стандартным макетом, не приобретает никаких возможностей, кроме того, что тривиальное и стандартное макеты предоставляют самостоятельно. Сочетание этих двух типов не делает тип особенным, и два свойства на самом деле не имеют ничего общего друг с другом.

Стандартная компоновка заключается в том, что компоновка непустых подобъектов являетсяопределены (а также его пустые подобъекты базового класса, не нарушающие макет типа). Тривиальность заключается в том, имеет ли объект какое-либо значение помимо блока битов, который он хранит (и является ли он концептуально допустимым объектом, если он инициализируется произвольным блоком битов).

Если я делаюшаблон, который принимает тип T, и я хочу посмотреть, смогу ли я memcpy объекты этого типа, меня не волнует расположение его членов;Я хочу знать, если это TriviallyCopyable. Точно так же, правильность offsetof не имеет никакого значения, если в классе есть предоставленный пользователем конструктор копирования. Все, что его волнует, - это если расположение подобъектов-членов происходит в четком, стандартном порядке.

В основном, люди оглянулись и поняли, что в C ++ не осталось ничего, что конкретно нуждается в пересечении * 1023. * Тривиальность и стандартная компоновка. Поэтому нам не нужно резервировать срок для этого. Те немногие места, где в стандарте прямо указано, что некоторый тип будет «POD», могут быть просто заменены «тривиальной и стандартной компоновкой», в зависимости от ситуации.

Является ли это рекурсивное требование избыточным?

Поскольку оба составляющих требования являются индивидуально рекурсивными, пересечение этих двух тоже рекурсивно. Таким образом, нет необходимости указывать, что все подобъекты также являются POD. Скорее всего, это был случай нечетности копирования и вставки, когда в первоначальном определении говорилось что-то вроде «все нестатические члены данных должны быть POD-типа», и они просто сохранили это утверждение как есть.

1 голос
/ 08 ноября 2019

Стандартная компоновка зависит от стандартной компоновки нестатических элементов:

[class.prop]

Класс S является классом стандартной компоновки, если он:

  • не имеет нестатических элементов данных типа нестандартного класса макета (или массива таких типов) или ссылки,

  • ...

Тривиальность также зависит от тривиальности нестатических элементов. Для краткости я процитировал только правило для конструктора по умолчанию, но другие специальные функции-члены имеют похожую формулировку:

[class.default.ctor]

Конструктор по умолчаниютривиален, если он не предоставлен пользователем и если:

  • ...
  • для всех не статических членов данных своего класса, которые имеют тип класса (или массивиз этого), каждый такой класс имеет тривиальный деструктор.

Насколько я могу судить, явное требование PODness для применения к членам является избыточным, поскольку оно также неявно следует из требованийбыть стандартным и тривиальным.

...