De la même manière que pour la légalité delete this
, le placement nouveau this
est également autorisé à ma connaissance. En outre, concernant l' this
utilisation éventuelle d'autres pointeurs / références préexistants, il existe quelques restrictions:
[basic.life]
Si, après la fin de la durée de vie d'un objet et avant que le stockage occupé par l'objet ne soit réutilisé ou libéré, un nouvel objet est créé à l'emplacement de stockage qu'occupait l'objet d'origine, un pointeur qui pointait vers l'objet d'origine, une référence qui fait référence à l'objet d'origine, ou le nom de l'objet d'origine fera automatiquement référence au nouvel objet et, une fois la durée de vie du nouvel objet commencée, pourra être utilisé pour manipuler le nouvel objet, si:
- le stockage du nouvel objet recouvre exactement l'emplacement de stockage qu'occupait l'objet d'origine, et
- le nouvel objet est du même type que l'objet d'origine (en ignorant les qualificatifs cv de niveau supérieur), et
- le type de l'objet d'origine n'est pas qualifié par const et, s'il s'agit d'un type de classe, ne contient aucun membre de données non statique dont le type est qualifié par const ou un type de référence, et
- ni l'objet d'origine ni le nouvel objet n'est un sous-objet potentiellement chevauchant ([intro.object]).
Les deux premiers sont satisfaits dans cet exemple, mais les deux derniers devront être pris en considération.
En ce qui concerne le troisième point, étant donné que la fonction n'est pas qualifiée const, il devrait être assez sûr de supposer que l'objet d'origine est non const. La faute est du côté de l'appelant si la constance a été rejetée. En ce qui concerne const / reference member, je pense que cela peut être vérifié en affirmant que c'est assignable:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Bien sûr, comme l'attribution est une exigence, vous pouvez simplement utiliser *this = {};
ce à quoi je m'attendrais pour produire le même programme. Un cas d'utilisation peut-être plus intéressant pourrait être de réutiliser la mémoire d' *this
un objet d'un autre type (ce qui ne répondrait pas aux exigences d'utilisation this
, au moins sans réinterprétation + blanchiment).
De même delete this
, un placement nouveau this
pourrait difficilement être décrit comme «sûr».