2017-01-07 5 views
5

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 

Так что, по-видимому, промотирование только не работает для (составных) заданий?

+1

достаточно Funnily, '* & мут 27 = 28;' компилируется. – mcarton

+0

@mcarton в вашем примере, продвижение происходит из-за оператора заимствования, а не оператора присваивания. Но интересно действительно^_^ –

+1

Связано: документация также говорит, что '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

ответ

1

The reference был обновлен с тех пор этот вопрос был размещен. Теперь он говорит, что rvalue для продвижения lvalue не происходит во время назначения, так что это, по-видимому, ошибка в старой ссылке.

Borrow operators:

Если & или & операторы MUT применяются к RValue, временное значение создается

Это, вероятно, предназначены для применения в ref привязок, а также, хотя я не вижу в нем особого упоминания.

Assignment:

Левый операнд должен быть именующим: использование RValue результатов в ошибке компилятора, вместо того чтобы способствовать его временнымам.

Смежные вопросы