В варианте класса я работаю необработанного хранения является массив символов:reinterpret_cast/static_cast и неопределенное поведение
alignas(/* the strictest alignment of all types of the variant */)
char storage[/* ... */];
Оператор присваивания является что-то вроде:
template<class X>
void operator=(const X &x)
{
// ...code for clearing the storage and setting the tag for type X...
new(storage) X(x);
}
а код для получения сохраненного объекта:
template<class X>
const X &get()
{
// ...
return *reinterpret_cast<X *>(storage);
// ...
}
Кажется, что это работает, но всегда ли оно определено? Я беспокоюсь о безопасном разыменовании указателя (допустимо ли это правилами псевдонимов типа?).
Существует ли какое-либо различие между текущей реализацией и
return *static_cast<const X *>(static_cast<const void *>(storage));
Связанным вопросом/ответ:
https://stackoverflow.com/a/7321815/3235496 (см James Kanze «s комментариев).
EDIT
Второй вопрос уже есть ответ здесь: C++ When should we prefer to use a two chained static_cast over reinterpret_cast
Несомненно, это «новое (хранилище) X (x);» - утечка памяти –
@EdHeal. Он создает X в хранилище с помощью размещения new. Это должно быть безопасная практика для выровненного хранилища (например, http://stackoverflow.com/questions/4583125/char-array-as-storage-for-placement-new). Не могли бы вы добавить некоторые детали? – manlio