!Clone вообще допустим?
                  
                  
                
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  TIL существует фича negative_impls, которая разрешает impl ! для любых трейтов. единственное предназначение — конфликтовать с другими попытками имплементировать.
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=15b0289aea05a17a77d202d92dddc232
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  остался вопрос, зачем запрещать имплементацию Clone для мутабельной ссылки. да, её нельзя сделать логично, но почему это небезопасно?
Проблема не в безопасности, а в том, что иначе компилятор не сможет разрешить impl for &mut _ и impl<T: Clone> for T
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  хм а где эти две имплементации конфликтуют?
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  и вроде как нельзя опираться на negative impls для целей coherence
impl Clone for &mut MyLocalTypeLol
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  ну, это сейчас запрещено
через impl !Clone, без него бы можно было
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  да и в чём проблема? где-то в стдлибе есть две имплементации, которые начинают конфликтовать при клонируемой мутабельной ссылке?
можно, negative impls — гарантия что тип никогда не будет реализовывать трейт
Потому что компилятор при кодогенерации опирается на предположение, что &mut-ссылка на значение есть только одна. Если оно нарушается, то компилятор может скомпилировать код неправильно
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  > 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).
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  это нерелевантно. сигнатура Clone::clone() не мешает имплементировать Clone для мутабельной ссылки, не нарушая алиасинг
 Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Max
                          Силинг
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  например, создав и ликнув ещё одно значение или просто запаниковав
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 всё таки связать, это нужно для того, чтобы некоторые косяки пофиксить например в ошибках
Обсуждают сегодня