Какова цель std:: launder?
P0137 вводит шаблон функции std::launder
и делает много, много изменений к стандарту в разделах относительно союзов, продолжительности жизни, и указателей.
какую проблему решает эта статья? Каковы изменения в языке, о которых я должен знать? А какие мы launder
ing?
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.