Здравствуйте, Caracrist, Вы писали:
C>new(&s)(w.s); — такое в операторе присваивания, это бесплатное пособие по UB
Наоборот, если слева мусор при присваивании (а с т.з. строки там мусор), то только так: инициализируем на мусоре новый объект. Иначе получим прогулку по памяти.
Мне непонятно, причем здесь C++11?
Здравствуйте, Masterkent, Вы писали:
M>Все эти хитрые манипуляции с памятью можно выполнять с помощью std::aligned_union или даже std::aligned_storage. Причём аналог boost::variant (который, в отличие от union-ов, достаточно высокоуровневый, чтобы им было удобно пользоваться), насколько я вижу, удобнее реализовывать именно через std::aligned_union, а не union-ы. Иными словами, для низкоуровневых операций вполне сгодится std::aligned_union, для высокоуровневых — какая-нибудь обёртка вокруг std::aligned_union. Чего ради надо было расширять возможности union-ов, непонятно (с учётом того, что std::aligned_union появилось раньше — см. N2369). Ещё интереснее то, что std::aligned_union собирались из стандарта выпилить, но потом одумались
Ну значит из эстетических соображений.