Наскільки я знаю, також, як і законності delete this
, this
дозволено розміщення нових осіб . Крім того, щодо того this
, чи можна потім використовувати інші попередньо вказані вказівники / посилання, є кілька обмежень:
[basic.life]
Якщо після закінчення терміну експлуатації об'єкта і до зберігання, яке займав об'єкт, буде повторно використаний або випущений, у місці зберігання, який займав оригінальний об'єкт, створюється новий об'єкт, вказівник, який вказував на початковий об'єкт, посилання на згаданий вихідний об'єкт, або ім'я оригінального об'єкта автоматично посилатиметься на новий об'єкт і, як тільки починається термін експлуатації нового об'єкта, може бути використаний для маніпулювання новим об'єктом, якщо:
- сховище для нового об’єкта точно перекриває місце зберігання, яке займав оригінальний об'єкт, і
- новий об’єкт того ж типу, що і вихідний об'єкт (ігноруючи найвищий рівень cv-кваліфікаторів), та
- тип вихідного об'єкта не має кваліфікації const, і, якщо тип класу, не містить жодного нестатичного члена даних, тип якого const-кваліфікований або референтний тип, і
- ні початковий об’єкт, ні новий об'єкт не є потенційно перекриваючим субооб'єктом ([intro.object]).
Перші два задоволені в цьому прикладі, але останні два потрібно взяти до уваги.
Щодо третього пункту, враховуючи те, що функція не відповідає рівню const, слід вважати досить безпечним припустити, що вихідний об'єкт не const. Помилка знаходиться на стороні абонента, якщо неприхотність була відкинута. Що стосується const / reference member, я думаю, що це можна перевірити, стверджуючи, що це можна присвоїти:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Звичайно, оскільки присвоєння є вимогою, ви можете замість цього просто використовувати те, *this = {};
що я б очікував для створення тієї ж програми. Можливо, більш цікавим випадком використання може бути повторне використання пам’яті *this
для об’єкта іншого типу (що не відповідає вимогам щодо використання this
, принаймні, без переосмислення + відмивання).
Подібне до delete this
, розміщення нового місця this
навряд чи можна охарактеризувати як "безпечне".