为什么 Rust 的 Box<T> Clone 实现需要 T 是克隆?

  • 本文关键字:实现 Clone Box Rust rust
  • 更新时间 :
  • 英文 :


我正在为通用Box<T>编写一个库,在代码的一部分,我需要克隆Box<T>,所以我做了这样的事情:

impl<T> OnTheFlySwap<T>
where
T: ?Sized + Send + Sync, Box<T>: Clone
{ 

我添加了Box<T>: Clone,认为这没什么大不了的,因为只有明确禁止Box<T>: Clone的对象才会有问题。但不,显然,如果对象没有显式实现Box<T>: Clone,那么我就有问题了,因为这是官方的impl Clone for Box:

impl<T, A> Clone for Box<T, A> where
T: Clone,
A: Allocator + Clone, 

它要求TClone.为什么?既然克隆一个Box不需要时间,难道每个Box<T>都不是Clone吗?如果一个对象不希望它的长方体被克隆,那么它可以为它实现!Clone,但对于任何T,默认值都应该是impl Clone for Box<T>

Rust中的Box<T>表示拥有T的方框。如果您可以克隆一个Box并获得指向同一T的第二个框,那么哪个框将拥有T值?Box不仅仅是Rust版本的C++指针;它代表了一个所有权的概念,而像C++这样的语言并没有强制执行这个概念。

作为练习,考虑自己编写您为Box::clone建议的函数。其签名将是

fn my_clone<T>(value: &Box<T>) -> Box<T> { ... }

尝试使用该签名编写一个函数,而不必探究unsafe。编译器会很快让你知道哪里出了问题。

克隆盒子的唯一安全方法是克隆盒子里的所有东西,这需要T : Clone

最新更新