Почему это значение не повышается до значения 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 приводит к ошибке компилятора, а не переводит его во временное состояние.

Другие вопросы по тегам