поверхностный ответ на вопрос "почему?"в том, что это просто правила as
выражений в Rust.Цитирование из Nomicon :
Приведение не является переходным, то есть даже если e as U1 as U2
является допустимым выражением, e as U2
не обязательно так.
С помощью оператора as
вы можете выполнять явные приведения или приведений .
Нет никакого броска или принуждения, чтобы перейти непосредственно от &u8
до *mut u8
.Однако существует принуждение к ослаблению указателя с &T
до *const T
и приведение от указателя к типу размера к любому другому.Сочетание двух результатов приводит к выражению в вашем вопросе.
Более глубокий вопрос заключается в том, почему язык был разработан таким образом.На самом деле я не знаю, так как меня не было в комнате, когда принимались эти решения, и я не мог найти обоснования в Интернете.Rust в целом пытается быть очень явным с приведением типов, чтобы избежать преобразований, которые на самом деле не были предназначены, и сохранить правила простыми.Похоже, что эти принцессы повлияли и на это конкретное дизайнерское решение.