В C ++ 20 концепция POD устарела, предположительно потому, что это бессмысленная составная черта тривиальности и стандартного расположения.
Неправильно. Термин POD устарел, потому что он больше не имеет значения :
Термин POD больше не служит цели в стандарте, он просто определен, и ограничения применяются для случаев, когданемногие другие типы сохраняют это рудиментарное свойство.
По сути, тип, который является как тривиальным, так и стандартным макетом, не приобретает никаких возможностей, кроме того, что тривиальное и стандартное макеты предоставляют самостоятельно. Сочетание этих двух типов не делает тип особенным, и два свойства на самом деле не имеют ничего общего друг с другом.
Стандартная компоновка заключается в том, что компоновка непустых подобъектов являетсяопределены (а также его пустые подобъекты базового класса, не нарушающие макет типа). Тривиальность заключается в том, имеет ли объект какое-либо значение помимо блока битов, который он хранит (и является ли он концептуально допустимым объектом, если он инициализируется произвольным блоком битов).
Если я делаюшаблон, который принимает тип T
, и я хочу посмотреть, смогу ли я memcpy
объекты этого типа, меня не волнует расположение его членов;Я хочу знать, если это TriviallyCopyable. Точно так же, правильность offsetof
не имеет никакого значения, если в классе есть предоставленный пользователем конструктор копирования. Все, что его волнует, - это если расположение подобъектов-членов происходит в четком, стандартном порядке.
В основном, люди оглянулись и поняли, что в C ++ не осталось ничего, что конкретно нуждается в пересечении * 1023. * Тривиальность и стандартная компоновка. Поэтому нам не нужно резервировать срок для этого. Те немногие места, где в стандарте прямо указано, что некоторый тип будет «POD», могут быть просто заменены «тривиальной и стандартной компоновкой», в зависимости от ситуации.
Является ли это рекурсивное требование избыточным?
Поскольку оба составляющих требования являются индивидуально рекурсивными, пересечение этих двух тоже рекурсивно. Таким образом, нет необходимости указывать, что все подобъекты также являются POD. Скорее всего, это был случай нечетности копирования и вставки, когда в первоначальном определении говорилось что-то вроде «все нестатические члены данных должны быть POD-типа», и они просто сохранили это утверждение как есть.