为什么对trait对象的引用不可复制?此代码编译:
struct Test;
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
v.clone()
}
fn main() {
}
这个没有:
trait Test {
fn do_smt(&self);
}
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
v.clone()
}
fn main() {
}
错误:
main3.rs:7:5: 7:14 error: failed to find an implementation of trait std::clone::Clone for &'a Test<no-bounds>
main3.rs:7 v.clone()
^~~~~~~~~
但是,就我所见,Clone
特征是针对任何类型的参考实现的:
impl<'a, T> Clone for &'a T {
/// Return a shallow copy of the reference.
#[inline]
fn clone(&self) -> &'a T { *self }
}
我只是不明白为什么&'a Test
Test
是一个特征是不可克隆的。毕竟它只是一个指针。例如,此限制禁止从&[&'a SomeTrait]
转到Vec<&'a SomeTrait>
,这看起来像是一个明显的转换,或克隆Vec<&'a SomeTrait>
,如示例所示。
这很奇怪,前提是我可以自己实施clone_vec()
,而不是Clone
:
fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
let mut result = Vec::new();
for &e in v.iter() {
result.push(e);
}
result
}
答案 0 :(得分:6)
Clone
是一个普通的库特征,需要所有类型的普通(库)实现。例如,Clone
已为&T
right here实施,其形式为:
impl<'a, T> Clone for &'a T {
/// Return a shallow copy of the reference.
#[inline]
fn clone(&self) -> &'a T { *self }
}
因此,&T
形式的所有内容都是Clone
能够...... T
具体类型。这就是关键:&Trait
不是(还)一种&T
形式的T = Trait
(而是一种&#34;原子&#34; /基本类型这不能被分成几部分),因此impl
不涵盖它。
我们需要动态大小的类型(DST),以便编译器能够推断只传递普通旧Trait
作为通用参数(Nick Cameron实际上在DST实现的某些部分很难工作,所以很快就会发生这种情况。)
但是,您可以针对您感兴趣的特征手动实施Clone
,例如以下效果很好:
trait Foo {}
impl<'a> Clone for &'a Foo {
fn clone(&self) -> &'a Foo {
*self
}
}
但是,它仅适用于当前包中定义的特征,否则编译器会担心一致性(例如,在Foo
上面Eq
更改为impl
会导致{{1 }})。