【发布时间】:2018-01-26 00:56:21
【问题描述】:
我正在尝试创建一个特征并为所有非引用类型提供一种实现,并为所有引用类型提供另一种实现。
编译失败:
trait Foo {}
impl<T> Foo for T {}
impl<'a, T> Foo for &'a mut T {}
这会失败并出现错误
error[E0119]: conflicting implementations of trait `Foo` for type `&mut _`:
--> src/main.rs:3:1
|
2 | impl<T> Foo for T {}
| -------------------- first implementation here
3 | impl<'a, T> Foo for &'a mut T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&mut _`
奇怪的是,这行得通:
trait Bar {}
impl<T> Bar for T
where
T: Clone,
{}
impl<'a, T> Bar for &'a mut T
where
T: Clone + 'static,
{}
为什么带有Clone 约束的版本可以工作,没有它我如何使它工作?
【问题讨论】:
-
为什么
impl<T> Foo for T {}不够用?我的意思是,为什么你需要专门为&mut引用实现它?&'a T还需要另一种实现方式吗? -
&mut T不是Clone。&mut T确实满足for T(因为 &mut T 是一种类型,impl<T> Bar for T也为每个&mut T实现 Bar)。克隆版本不会冲突,因为&mut T永远不会是Clone(你不能有两个可变引用)。
标签: rust