2017-01-07 33 views
5

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ń?

+1

Co zabawne, '* i mut 27 = 28;' kompiluje. – mcarton

+0

@mcarton w twoim przykładzie, promocja dzieje się z powodu operatora pożyczającego, a nie operatora przypisania. Ale rzeczywiście interesujące^_^ –

+1

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

Odpowiedz

1

The reference został zaktualizowany od czasu opublikowania tego pytania. Teraz mówi, że promocja rvalue to lvalue nie występuje podczas przypisywania, więc najwyraźniej był to błąd w starym odnośniku.

Borrow operators:

Jeśli operatorzy Mut & lub & są stosowane do rvalue wartość tymczasowa jest tworzona

to prawdopodobnie oznaczało zastosowanie do ref wiązań, a także, choć nie widzę tego wyraźnie wymienionego.

Assignment:

Argument lewa musi być lwartością: using rvalue wyniki w błąd kompilatora, zamiast promowania go do tymczasowego.