Разве неопределенное поведение - разыменовать * mut T приведение к * mut ManuallyDrop <T>? - PullRequest
0 голосов
/ 27 октября 2018

Согласно документации, ManuallyDrop<T> - это оболочка с нулевой стоимостью. Означает ли это, что я могу разыменовать необработанный указатель на ManuallyDrop<T>, преобразованный из необработанного указателя в T?

1 Ответ

0 голосов
/ 27 октября 2018

ManuallyDrop - это , объявленный как #[repr(transparent)]:

#[stable(feature = "manually_drop", since = "1.20.0")]
#[lang = "manually_drop"]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct ManuallyDrop<T: ?Sized> {
    value: T,
}

#[repr(transparent)] - , описываемый как :

Атрибут может быть применен к структурам, подобным новому типу, которые содержат одно поле.Это указывает на то, что новый тип должен быть представлен точно так же, как и тип этого поля, т. Е. Новый тип должен игнорироваться для целей ABI [sic]: он не только размещен в памяти одинаково, он также передается идентично в вызовах функций.

[...]

PtrWithCustomZst также представляется в точности как *const Foo

Я считаю, что это преобразование безопасно выполнить.


Реальный вопрос - , почему вы бы хотели это сделать?Указатель на структуру ManuallyDrop кажется довольно бессмысленным.Если у вас есть указатель на T, базовое значение не будет сброшено для начала.Если вы преобразуете указатель в ссылку (гарантируя, что соблюдаете правила ссылок), ссылка также не сбрасывает базовое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...