Так же, как и законность delete this
, размещение новых для this
также разрешено, насколько я знаю. Кроме того, в отношении того this
, могут ли впоследствии использоваться другие уже существующие указатели / ссылки, существует несколько ограничений:
[Basic.life]
Если по истечении времени жизни объекта и до повторного использования или освобождения хранилища, которое занимал объект, в месте хранения, которое занимал исходный объект, создается новый объект, указатель, указывающий на исходный объект, ссылка, которая ссылка на исходный объект, или имя исходного объекта будет автоматически ссылаться на новый объект и после запуска времени жизни нового объекта может использоваться для манипулирования новым объектом, если:
- хранилище для нового объекта точно перекрывает место хранения, которое занимал исходный объект, и
- новый объект того же типа, что и исходный объект (без учета cv-квалификаторов верхнего уровня), и
- тип исходного объекта не является константно-квалифицированным, и, если тип класса, не содержит какого-либо нестатического члена данных, тип которого является константно-квалифицированным или ссылочным типом, и
- ни исходный объект, ни новый объект не являются потенциально перекрывающимися подобъектами ([intro.object]).
Первые два удовлетворены в этом примере, но последние два должны быть приняты во внимание.
Что касается третьего пункта, учитывая, что функция не является константной, следует с уверенностью предположить, что исходный объект не является константным. Ошибка на стороне вызывающей стороны, если постоянство было отброшено. Что касается const / reference member, я думаю, что это можно проверить, утверждая, что это присваивается:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Конечно, поскольку присваиваемость является требованием, вместо этого вы могли бы просто использовать тот, *this = {};
который я ожидал бы создать ту же программу. Возможно, более интересный вариант использования мог бы заключаться в повторном использовании памяти *this
для объекта другого типа (что не соответствовало бы требованиям для использования this
, по крайней мере, без повторной интерпретации + отмывания).
Подобно тому delete this
, что новое размещение this
вряд ли можно назвать «безопасным».