~A();
void reinitialize()
{
A::~A();
new(this) A;
}
};
Легально ли так делать? Я не вижу причин почему нет, но уверенности нет
после вызова деструктора this остаётся валидным? кажется, что вряд ли.
кое кто делает, но в любом случае это выглядит как уб и ломает логику компилятору
а что с ним случится? ну даже если и так, то A * a = this; ~A(); new (a) A; точно валидно
а есть пруфы что это уб?
Если я не ошибаюсь после этого нельзя пользоваться старыми указателями. Кажется это одно из применений launder.
launder для ситуаций когда разные типы в одной памяти в разное время. Ну и вроде уже не нужно его использовать никогда
Есть свойство transparently-replaceable.
спасибо! у меня не op=, но пример оттуда очень похож на мой случай
Там как раз про это раздел, емнип.
Из ссылки Sergey (спасибо, не знал про transparently-replacable): https://eel.is/c++draft/basic.life#note-4
Нельзя трогать this после вызова деструктора Не уверен даже, что можно так вызывать деструктор (там по-моему была какая то хрень про то что нельзя явно звать деструктор объекта у которого он автоматически вызывается) По-моему проще всего сделать так: Все внутренности A поместить в union { AImpl impl; }; impl.~AImpl(); new (&impl) AImpl{};
тут уже привели ссылку на стандарт, где такой код в примере явно обозначен well-defined
А можно для общего развития, почему так нужно делать вместо реинициализации полей допустим?
А, хотя в деструкторе может какие то сайд эффекты
в моем случае class A унаследован от другого класса из сторонней библиотеки, и у меня просто нет доступа к его полям
Видел, что таким методом реализуют copy и move операторы через соответствующие кторы.
Обсуждают сегодня