Rust Reference mówi:Dlaczego ta wartość nie jest promowana do lwartości określonej w pliku odniesienia?
Lewa operand wyrażenia przypisania lub związek przypisanie jest lwartością kontekście, ponieważ jest jednym operand jednoargumentowy transakcje.
[...]
Kiedy rvalue jest stosowany w lwartością kontekście tymczasowa un nazwie lwartość jest tworzony i używany.
Ta promocja RValue oczywiście współpracuje z pożyczek:
let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created
Ale to nie wydają się działać w cesji (choć odniesienie mówi o wszystkie lwartości kontekstach, nie tylko kredytu):
27 = 28; // error[E0070]: invalid left-hand side expression
The error description of E0070 nie wspomina o tej promocji rvalue. Czy jest to błąd w odnośniku, czy rzeczywiście istnieje jakiś sposób wywołania promocji rvalue z przydziałem lub wyrażeniami przypisania złożonego?
Istnieje trzeci rodzaj kontekstu l-wartości, który odniesienie opisuje również niepoprawnie. Ilekroć jest wzór z ref
w nim, wartość lewej wiązania do tego wzoru jest kontekstem lwartości. Okazuje się, że promocja działa w tym przypadku:
let ref x = 3; // works
Najwyraźniej promocja nie działa tylko w przypadku (złożonych) zadań?
Co zabawne, '* i mut 27 = 28;' kompiluje. – mcarton
@mcarton w twoim przykładzie, promocja dzieje się z powodu operatora pożyczającego, a nie operatora przypisania. Ale rzeczywiście interesujące^_^ –
Powiązane: dokumentacja wydaje się również mówić, że 'let mut a = 1; * i mut (a) = 2; assert_eq! (a, 1); 'powinien przekazać:' a' w '(a)' nie jest operandem '& mut', więc powinno zostać przekonwertowane na wartość r. '(a)' to jest wartość r, która jest operandem '& mut', więc należy utworzyć z niej tymczasowy, a temu tymczasowemu powinno zostać przypisane' 2'. Zamiast tego "a" ma przypisany "2".(Prostsze jest powiedzenie '(a) = 2;' powinno zostać odrzucone, ale myślę, że kod, który kompiluje się w dowolny sposób, ale ma inne zachowanie w czasie wykonywania jest bardziej interesujący.) Zachowanie kompilatora ma jednak sens, dla twojego kodu i mojego . – hvd