Следующий код приводит к ошибке ( Детская площадка )
#![feature(specialization)]
trait Foo {
type Assoc;
fn foo(&self) -> &Self::Assoc;
}
default impl<T> Foo for T {
type Assoc = T;
fn foo(&self) -> &Self::Assoc {
self
}
}
Ошибка:
error[E0308]: mismatched types
--> src/main.rs:20:9
|
20 | self
| ^^^^ expected associated type, found type parameter
|
= note: expected type `&<T as Foo>::Assoc`
found type `&T`
Это странно, поскольку <T as Foo>::Assoc
T
, так что должно работать.Даже более странно: когда я удаляю ключевое слово default
из impl, оно работает (но, конечно, в моем реальном коде мне нужно пометить impl как default
).
Та же ошибка возникает, когдапредоставление значений по умолчанию в определении черты ( Playground ):
#![feature(specialization)]
#![feature(associated_type_defaults)]
trait Foo {
type Assoc = Self;
fn foo(&self) -> &Self::Assoc {
self
}
}
Что здесь происходит?Это ошибка компилятора?Или - и именно поэтому я задаю этот вопрос - имеет ли эта ошибка смысл, поскольку в специализации есть что-то особенное, чего я еще не понял?В случае, если это ошибка, mem::transmute
, безусловно, безопасно, riiiight?