Обратите внимание, что это вопрос с тегом языка, который означает правила и формулировку стандарта C ++, а не практических, реальных вариантов использования (мне известно о преимуществах std :: variant). Тем не менее, рекомендации о том, как решить эту конкретную проблему на практике. /> Значит ли это, что замена объекта через размещение новое только работает, как и ожидалось, когда нет другого размещения нового типа, используя одно и то же место перед ним? < /p>
Код: Выделить всё
int i = 0;
new (&i) float(3.5); // reuses storage
new (&i) int(5); // transparent replacement does not apply?
int j = i + 1; // ==6? UB?
В этом фрагменте [basic.life]/10 не применяется к строке 3, потому что это новое размещение не происходит до того, как я не будет повторно использован? Нет безопасного общего способа переключения активного члена профсоюза: < /p>
Код: Выделить всё
union U{int i; float f;};
U u = {5}; // i is active
// option 1:
u.f = 2.5; // assignment implicitly creates object for union members
u.i = 7;
// option 2:
new(&u.f) float(2.5);
new(&u.i) int(7);
// afterwards
//Can I use u.i here?
Даже если мы предположим, что вариант 1 не составляет «повторное использование хранилища» в смысле [basic.life]/10, этот вариант неявно создает объекты, когда вовлеченные типы имеют тривиальные или встроенные операторы задания (и ctors), в противном случае стандарт относится к необходимости. общее решение. Тем не менее, вариант 2 страдает от проблемы, описанной в начале, означает, что оба варианта, возможно, являются недействительными.
Однако эта интерпретация сделает невозможным ever переключаться между различными активными членами, что не может быть намерением. Повторное использование, потому что указатель перешел в новое размещение, отличается для каждого участника, даже если у них один и тот же адрес?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... ons-broken