在下面的示例代码中,特征Foo
要求关联的类型X
实现Clone
特征.
在do_it
函数签名中使用impl Foo<X = Baz>
语法时,cargo check
不会抱怨Baz
没有实现Clone
特征.
然而,在impl Foo for Bar
区,确实有cargo check
人抱怨这个问题.
我本以为会有impl Foo<X = Baz>
人以同样的方式抱怨.
trait Foo {
type X: Clone;
}
struct Bar;
struct Baz;
impl Foo for Bar {
type X = Baz; // <- complains Baz does not impl Clone trait
}
fn do_it(foo: impl Foo<X = Baz>) {} // <- does not complain
如果X
是泛型参数,则情况并非如此.在这种情况下,cargo check
表示foo: impl Foo<Bar>
不满足Clone
性状界限
trait Foo<X>
where
X: Clone,
{
}
struct Bar;
struct Baz;
fn do_it(foo: impl Foo<Baz>) {} // <- complains Baz does not impl Clone trait
这是故意的行为吗?如果是的话,原因是什么?