Rust Reference говорит:Почему это rvalue не продвигается до значения lvalue, как указано в ссылке?
Левый операнд выражения уступки или составного присваивания является именующее контекст, так как это единственный операнд одноместной заема.
[...]
Когда Rvalue используются в 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
error description of E0070 не упоминает об этом продвижении rvalue. Является ли это ошибкой в ссылке или действительно существует какой-то способ инициировать продвижение rvalue с присвоением или сложными выражениями присваивания?
Существует третий вид контекста, именующего которого ссылка описывает неправильно, тоже. Всякий раз, когда в нем есть шаблон с ref
, привязка левого значения к этому шаблону представляет собой контекст lvalue. Оказывается, продвижение работает в этом случае:
let ref x = 3; // works
Так что, по-видимому, промотирование только не работает для (составных) заданий?
достаточно Funnily, '* & мут 27 = 28;' компилируется. – mcarton
@mcarton в вашем примере, продвижение происходит из-за оператора заимствования, а не оператора присваивания. Но интересно действительно^_^ –
Связано: документация также говорит, что 'let mut a = 1; * & mut (a) = 2; assert_eq! (a, 1); 'должен пройти:' a' in '(a)' не является операндом '& mut', поэтому его нужно преобразовать в rvalue. '(a)' then является rvalue, который является операндом '& mut', поэтому из него должно быть создано временное, а этому временному должно быть присвоено' 2'. Вместо этого 'a' присваивается' 2'.(Упрощение состоит в том, чтобы сказать '(a) = 2;' должно быть отклонено, но я думаю, что код, который компилируется в любом случае, но имеет другое поведение во время выполнения, более интересен.) Поведение компилятора имеет смысл, хотя для вашего кода и моего , – hvd