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