Какова цель std:: launder?
P0137 вводит шаблон функции std::launder и делает много, много изменений к стандарту в разделах относительно союзов, продолжительности жизни, и указателей.
какую проблему решает эта статья? Каковы изменения в языке, о которых я должен знать? А какие мы laundering?
1 ответ:
std::launderметко назван, хотя только если вы знаете, для чего это. Он выполняет отмывание памяти.Рассмотрим пример в газете:
struct X { const int n; }; union U { X x; float f; }; ... U u = {{ 1 }};этот оператор выполняет агрегатную инициализацию, инициализируя первый член
UС{1}., потому что
nэтоconstпеременная, компилятор может предположить, чтоu.x.nдолжны всегда быть 1.так что же происходит, если мы сделайте это:
X *p = new (&u.x) X {2};, потому что
Xтривиально, нам не нужно уничтожать старый объект перед созданием нового на его месте, так что это совершенно законный код. Новый объект будет иметь свойnчлены 2.