首页 > 解决方案 > 为什么是 Rust 的盒子克隆实现需要 T 是克隆?

问题描述

我正在为泛型编写一个库,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<T>可以Clone,因为克隆 aBox不需要时间?如果一个对象不希望它的盒子被克隆,那么它可以!Clone为它实现,但默认应该是impl Clone for Box<T>any T

标签: rust

解决方案


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

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

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

尝试使用该签名编写一个函数,而无需深入研究unsafe. 编译器会很快让你知道出了什么问题。

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


推荐阅读