为什么Rust的Box<T>Clone实现需要T是Clone?
我正在为泛型编写一个库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<T>可以Clone,因为克隆 aBox不需要时间吗?如果一个对象不希望它的盒子被克隆,那么它可以!Clone为它实现,但默认值应该是impl Clone for Box<T>any T。
回答
一Box<T>在锈代表一个盒子,其拥有一个T。如果您可以克隆 aBox并获得指向同一个的第二个框T,那么哪个将拥有该T值?Box不仅仅是 Rust 版本的 C++ 指针;它代表了像 C++ 这样的语言不强制执行的所有权概念。
作为练习,请考虑尝试编写您为Box::clone自己建议的函数。它的签名是
fn my_clone<T>(value: &Box<T>) -> Box<T> { ... }
尝试使用该签名编写一个函数而不使用unsafe. 编译器会很快让您知道出了什么问题。
克隆一个盒子的唯一安全方法是也克隆盒子里面的所有东西,这需要T : Clone.
THE END
二维码