!Clone вообще допустим?
TIL существует фича negative_impls, которая разрешает impl ! для любых трейтов. единственное предназначение — конфликтовать с другими попытками имплементировать.
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=15b0289aea05a17a77d202d92dddc232
остался вопрос, зачем запрещать имплементацию Clone для мутабельной ссылки. да, её нельзя сделать логично, но почему это небезопасно?
Проблема не в безопасности, а в том, что иначе компилятор не сможет разрешить impl for &mut _ и impl<T: Clone> for T
хм а где эти две имплементации конфликтуют?
и вроде как нельзя опираться на negative impls для целей coherence
impl Clone for &mut MyLocalTypeLol
ну, это сейчас запрещено
через impl !Clone, без него бы можно было
да и в чём проблема? где-то в стдлибе есть две имплементации, которые начинают конфликтовать при клонируемой мутабельной ссылке?
можно, negative impls — гарантия что тип никогда не будет реализовывать трейт
Потому что компилятор при кодогенерации опирается на предположение, что &mut-ссылка на значение есть только одна. Если оно нарушается, то компилятор может скомпилировать код неправильно
> This is a prototype impl that extends impl !Trait beyond auto traits. It is not integrated with coherence or anything else, and hence only serves to prevent downstream impls (but not to allow downstream crates to rely on the absence of such impls for coherence purposes).
это нерелевантно. сигнатура Clone::clone() не мешает имплементировать Clone для мутабельной ссылки, не нарушая алиасинг
например, создав и ликнув ещё одно значение или просто запаниковав
upd: нет, я что-то наврал, impl<T: Clone> Trait for T {} impl<T> Trait for &mut T {} и сейчас не разрешён
https://github.com/rust-lang/negative-impls-initiative/issues/1
по крайней мере есть планы coherence и negative_impls всё таки связать, это нужно для того, чтобы некоторые косяки пофиксить например в ошибках
Обсуждают сегодня