我正在为通用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,
它要求T
是Clone.
为什么?既然克隆一个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
。