Почему это значение не повышается до значения l, как указано в ссылке?
Справочник по ржавчине говорит:
Левый операнд выражения присваивания или составного присваивания является lvalue-контекстом, как и единственный операнд унарного заимствования.
[...]
Когда rvalue используется в контексте lvalue, вместо него создается временное безымянное lvalue.
Это продвижение rvalue, очевидно, работает с заимствованиями:
let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created
Но, похоже, это не работает в задании (хотя ссылка говорит обо всех контекстах lvalue, а не только о заимствовании):
27 = 28; // error[E0070]: invalid left-hand side expression
В описании ошибки E0070 не упоминается эта рекламная акция. Является ли это ошибкой в ссылке или действительно есть какой-то способ вызвать повышение значения с помощью выражений присваивания или составного присваивания?
Существует третий тип контекста lvalue, который ссылка также описывает неправильно. Всякий раз, когда есть шаблон с ref
в нем привязка левого значения к этому шаблону является контекстом lvalue. Оказывается, продвижение работает в этом случае:
let ref x = 3; // works
Очевидно, что продвижение не работает только для (составных) заданий?
1 ответ
Ссылка была обновлена с момента публикации этого вопроса. Теперь говорится, что при назначении не происходит повышение значения до значения, поэтому в старой ссылке это, очевидно, было ошибкой.
Если операторы & или & mut применяются к значению r, создается временное значение
Вероятно, это относится к ref
привязки также, хотя я не вижу этого явно упоминается.
Левый операнд должен быть lvalue: использование rvalue приводит к ошибке компилятора, а не переводит его во временное состояние.