В настоящее время я использую aligned_storage для реализации типа "Дополнительный", аналогичного типу boost:: optional. Для этого у меня есть член класса, например:
typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type t_;
Я использую новое место для создания объекта, но я не сохраняю указатель, возвращенный где угодно. Вместо этого я обращаюсь к базовому типу объекта во всех моих функциях-членах, подобных этому (очевидно, с проверками, чтобы гарантировать, что объект действителен через логический флаг, также сохраненный в моем необязательном типе):
T const* operator->() const {
return static_cast<T const*>(static_cast<void const*>(&t_));
}
Мой вопрос: безопасно ли это. Я понимаю, что мое использование места размещения изменяет "динамический тип" объекта, и пока я продолжаю обращаться к памяти с использованием этого типа, я буду в порядке. Однако я не знаю, должен ли я удерживать указатель, возвращенный из нового места размещения, или мне разрешено просто указывать базовый тип всякий раз, когда мне нужно получить к нему доступ. Я прочитал раздел 3.10 стандарта С++ 11, однако я недостаточно уверен в стандартах, чтобы быть уверенным.
Если возможно, мне было бы лучше, если бы вы могли дать ссылку на стандарт в своем ответе (это помогает мне спать по ночам: P).