No C ++ 20, o conceito de POD foi descontinuado, supostamente porque é uma característica composta sem sentido de ser trivial e com layout padrão.
Incorreta. O termo POD está sendo preterido porque não importa mais :
O termo POD não serve mais a um propósito do padrão, é apenas definido e as restrições se aplicam quando alguns outros tipos preservam essa propriedade vestigial.
Essencialmente, um tipo de layout trivial e padrão não ganha nenhuma habilidade além do que é trivial e o layout padrão fornece por conta própria. A combinação dos dois não torna o tipo especial e as duas propriedades não têm muito a ver uma com a outra.
O layout padrão é sobre o layout de seus subobjetos não vazios que estão sendo bem definidos (assim como seus subobjetos de classe base vazios, que não perturbam o layout do tipo). Trivialidade é sobre se o objeto tem algum significado além do bloco de bits que armazena (e se é conceitualmente um objeto válido se for inicializado com um bloco arbitrário de bits).
Se estou criando um modelo que usa um tipo T
e quero ver se consigo memcpy
objetos desse tipo, não me importo com o layout de seus membros; Quero saber se é TriviallyCopyable. Da mesma forma, a correção de offsetof
não se importa nem um pouco se a classe tiver um construtor de cópias fornecido pelo usuário. Tudo o que importa é se o layout dos subobjetos dos membros ocorrer em uma ordem clara e aplicada por padrão.
Basicamente, as pessoas olharam em volta e perceberam que não havia mais nada em C ++ que precisasse especificamente da interseção de trivialidade e layout padrão. Portanto, não precisamos reservar um prazo para isso. Os poucos locais em que o padrão declara expressamente que algum tipo será "POD" podem ser simplesmente substituídos por "layout trivial e padrão", conforme apropriado.
Esse requisito recursivo é redundante?
Como os dois requisitos constituintes são recursivos individualmente, a interseção dos dois também é recursiva. Portanto, não há necessidade explícita de afirmar que todos os subobjetos também são POD. Isso foi mais do que provável apenas um caso de uma estranheza de copiar e colar, em que a definição original dizia algo como "todos os membros de dados não estáticos devem ser do tipo POD" e eles mantiveram essa declaração como está.
O layout padrão depende do layout padrão de membros não estáticos:
A trivialidade também depende da trivialidade de membros não estáticos. Por uma questão de concisão, citei apenas a regra para o construtor padrão, mas as outras funções-membro especiais têm palavras semelhantes:
Tanto quanto posso dizer, o requisito explícito do PODness de aplicar aos membros é redundante, pois também implica implicitamente os requisitos de layout padrão e trivial.
fonte