В настоящее время я используюalign_storage для реализации типа «Необязательный», аналогичный типу boost:: необязательный. Для этого у меня есть такой член класса:
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_));
}
Мой вопрос в том, безопасно ли это. Насколько я понимаю, мое использование размещения new изменяет «динамический тип» объекта, и пока я продолжаю обращаться к памяти, используя этот тип, со мной все будет в порядке. Однако мне не ясно, должен ли я удерживать указатель, возвращенный из нового размещения, или мне разрешено просто приводить к базовому типу всякий раз, когда мне нужно получить к нему доступ. Я прочитал раздел 3.10 стандарта С++ 11, однако я недостаточно свободно говорю на стандартном языке, чтобы быть уверенным.
Если возможно, я бы чувствовал себя лучше, если бы вы могли сослаться на стандарт в своем ответе (это помогает мне спать по ночам: P).
new
. Очевидным случаем является выделение черезnew[]
; Реализации часто хранят информацию, необходимую для уничтожения объектов массива, в первых байтах распределения. - person justin   schedule 20.11.2012std::optional
... - person Macmade   schedule 31.01.2018