Quels sont, le cas échéant, les changements apportés aux règles d’initialisation à vie de la mémoire dans la nouvelle norme?

Autant que je sache, la memcpy dans un stockage non initialisé ne peut pas être utilisée en toute sécurité pour créer une copie de l’object source.

Cependant, dans ce fil de l’année dernière sur la liste “ub” ouverte du WG21, un participant fait référence aux nouvelles règles d’initiation de la durée de vie memcpy :

Cela ne semble pas atteindre le niveau d’un rapport de bogue, mais cela pourrait être pertinent pour les nouvelles règles d’initiation de la durée de vie de memcpy. Atsortingbueront-ils un type statique aux octets source et destination?

En fonction du contexte de la question et du peu d’exemple de code d’effacement de type, il semble que cela puisse être lié à la création de nouveaux objects dans aligned_storage via memcpy .

Malgré toutes mes recherches, je ne trouve aucune référence aux nouvelles règles. Je suis particulièrement curieux s’ils s’appliquent uniquement au remplacement du contenu d’un object déjà créé ou s’ils modifient la situation en ce qui concerne la création potentielle d’un object dans la mémoire non initialisée.

La formulation a un peu changé, mais l’idée générale rest la même. De intro.object :

Un object est créé par une définition, par une nouvelle expression , lors de la modification implicite du membre actif d’une union ou lors de la création d’un object temporaire ([conv.rval], [class.temporary]).

Ce sont les quatre seules façons de créer un object en C ++. memcpy ne correspond à aucune de ces quatre conditions et par conséquent, il ne crée pas (et n’a jamais créé auparavant) de durée de vie (le changement actif du membre actif d’une union peut s’effectuer via = uniquement , et non via memcpy ).

La citation fait référence à un futur changement hypothétique à la norme qui donnerait memcpy telle capacité à la memcpy dans certaines situations. Il y avait aussi un très long fil sur le sujet plus tôt dans l’année.