gpt4 book ai didi

rust - 为什么我们使用 `Box::pin` 来表示 !Unpin 而使用 `Pin::new` 来表示 Unpin?

转载 作者:行者123 更新时间:2023-12-05 01:06:06 28 4
gpt4 key购买 nike

在 rust 中学习 Pin 的实现时我很困惑。

我知道当一个类型不能安全移动时,它可以实现 !UnpinPin 是为了防止别人从这些类型中获取到&mut T,使他们不能是std::mem::swap

如果 Pin 是为 !Unpin 类型设计的,为什么我们不能只在这些类型上调用 Pin::new

它给出如下错误。我知道我应该使用 Pin::new_unchecked,但是为什么呢?

struct TestNUnpin {
b: String,
}
impl !Unpin for TestNUnpin {}

// error: the trait `Unpin` is not implemented for `TestNUnpin`
std::pin::Pin::new(&TestNUnpin{b: "b".to_owned()});

我的理由是:

  1. 固定是为了帮助!取消固定类型
  2. 我们可以将 !Unpin 类型传递给 Pin::new 以使其不可移动。
  3. 对于 Unpin 类型,它们不能被固定,所以我们不能通过 Pin::new 创建

最佳答案

我认为您要查找的内容可以在 Safety section 中找到。的 Pin::new_unchecked .本质上,Pin应该保证固定值将永远再次移动(除非它实现 Unpin ),即使在 Pin 之后也是如此被丢弃。这种失败的一个例子是 Pin<&mut T> .您可以放弃 Pin并且该值不再被借用,因此您可以再次自由移动它,打破 Pin的核心保障。这是一个例子:

use std::marker::PhantomPinned;
use std::pin::Pin;

fn main() {
let x = PhantomPinned;

{
let _pin = Pin::new(&x); // error[E0277]: `PhantomPinned` cannot be unpinned
}

let y = Box::new(x); // the PhantomPinned is moved here!
}

如果不对借用检查器增加大量额外的复杂性,这个检查在编译时根本是不可行的,所以它被标记为 unsafe ,本质上是说确保它正常工作是开发人员的工作。原因Box::pin存在且安全是因为 Box 的开发者可以保证其安全:Box是一个拥有且唯一的指针,所以一旦它的 Pin被删除,它的值也被删除,并且不再有任何方法可以移动该值。

关于rust - 为什么我们使用 `Box::pin` 来表示 !Unpin 而使用 `Pin::new` 来表示 Unpin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69854787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com