Я собираюсь проигнорировать ваш прямой вопрос, потому что я полагаю, что вы пришли к нему после неправильного понимания нескольких начальных шагов.
Я мог бы в теории переместить указатель buf
из MyTrace
и использовать if после того, как структура умерла
Скопируйте указатель, не двигайте его, но да.
Используя PhantomData
, мы можем обеспечить получение только ссылок на buf
Это не правда. По-прежнему одинаково легко получить копию необработанного указателя и использовать его неправильно, даже если вы добавите PhantomData
.
Правильно ли я понял мотивацию для PhantomData
в этом сценарии?
Нет. PhantomData
используется, когда вы хотите действовать так, как будто у вас есть значение какого-то типа, но на самом деле его нет. Притворяться, что у вас есть ссылка на что-либо, полезно только тогда, когда есть что-то, что имеет ссылку на . Там нет такого значения для ссылки в вашем примере.
Документы Rust говорят что-то о необработанных указателях и PhantomData
, но, возможно, я ошибся
Этот пример действительно хорошо показывает мою точку зрения. Тип Slice
должен вести себя так, как если бы он имел ссылку на Vec
, у которого он заимствован:
fn borrow_vec<'a, T>(vec: &'a Vec<T>) -> Slice<'a, T>
Поскольку этот тип Slice
на самом деле не имеет ссылки, ему нужно от PhantomData
до act , как у него есть ссылка. Обратите внимание, что срок службы 'a
не просто состоит из цельной ткани - он связан с существующим значением (Vec
). Это может привести к небезопасной памяти для Slice
после перемещения Vec
, поэтому имеет смысл включить срок жизни Vec
.
почему комментатор в другом вопросе предложил использовать PhantomData
для повышения безопасности типов моего необработанного указателя
Вы можете использовать PhantomData
для повышения безопасности необработанных указателей, которые действуют как ссылки, но у вас нет некоторого существующего значения Rust для ссылки. Вы также можете использовать его для корректности, если ваш указатель владеет некоторым значением за ссылкой, что, по-видимому, делает ваше. Однако, поскольку это c_void
, это не очень полезно. Обычно вы видите это как PhantomData<MyOwnedType>
.
Откуда в сообщении об ошибке появляется 'static
?
Зачем нужно добавлять время жизни к черте с помощью оператора плюс (Iterator + 'a)?