Почему приведение константной ссылки непосредственно к изменяемой ссылке недопустимо в Rust? - PullRequest
0 голосов
/ 24 ноября 2018

Этот фрагмент кода правильный:

fn f() {
    let mut x = 11;
    b(&x as *const u8 as *mut u8);
}

fn b(x: *mut u8) {}

Почему b(&x as *const u8 as *mut u8) допустимо, тогда как b(&x as *mut u8) недействительно?Компилятор жалуется на:

ошибка [E0606]: приведение &u8 к *mut u8 недопустимо

1 Ответ

0 голосов
/ 24 ноября 2018

поверхностный ответ на вопрос "почему?"в том, что это просто правила as выражений в Rust.Цитирование из Nomicon :

Приведение не является переходным, то есть даже если e as U1 as U2 является допустимым выражением, e as U2 не обязательно так.

С помощью оператора as вы можете выполнять явные приведения или приведений .

Нет никакого броска или принуждения, чтобы перейти непосредственно от &u8 до *mut u8.Однако существует принуждение к ослаблению указателя с &T до *const T и приведение от указателя к типу размера к любому другому.Сочетание двух результатов приводит к выражению в вашем вопросе.

Более глубокий вопрос заключается в том, почему язык был разработан таким образом.На самом деле я не знаю, так как меня не было в комнате, когда принимались эти решения, и я не мог найти обоснования в Интернете.Rust в целом пытается быть очень явным с приведением типов, чтобы избежать преобразований, которые на самом деле не были предназначены, и сохранить правила простыми.Похоже, что эти принцессы повлияли и на это конкретное дизайнерское решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...