Какова цель std:: launder?


P0137 вводит шаблон функции std::launder и делает много, много изменений к стандарту в разделах относительно союзов, продолжительности жизни, и указателей.

какую проблему решает эта статья? Каковы изменения в языке, о которых я должен знать? А какие мы laundering?

1 162

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.