2017-01-07 13 views
5

Rust Referenceは言う:単項ボローの単一オペランドのようこのrvalueが参照で指定されているlvalueに昇格されないのはなぜですか?

割り当てまたは化合物代入式の左側のオペランドは、左辺値コンテキストです。

[...]右辺値が左辺値コンテキストで使用されて

、一時的に解除という名前の左辺値が作成され、代わりに使用されます。

この右辺値プロモーションは明らか借入で動作します:

:(参考程度 すべて左辺値コンテキストだけでなく、借りを話すが)

let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created 

しかし、割り当てで動作するようには思えません

27 = 28; // error[E0070]: invalid left-hand side expression 

error description of E0070には、このrvalueプロモーションは記載されていません。これは参照の間違いですか、または代入または複合代入式で右辺値昇格をトリガする方法はありますか?

第3の種類の左辺値のコンテキストがありますが、この参照でも誤って説明されています。 refのパターンがあるときはいつでも、そのパターンへの左の値バインディングは左辺のコンテキストです。この場合のプロモーションは次のようになります。

明らかに、宣伝は(複合)割り当てには対応していません。

+1

十分におかしく、 '*&mut 27 = 28;'はコンパイルします。あなたの例では – mcarton

+0

@mcartonのプロモーションは、代入演算子ではなく借用演算子のために発生します。しかし興味深いことに確かに^ _^ –

+1

関連:ドキュメントは 'let mut a = 1; *&mut(a)= 2; assert_eq!(a、1); 'は渡すべきです:'(a) 'の' a'は '&mut'のオペランドではないので、rvalueに変換する必要があります。 '(a)'はrvalueで、これは '&mut'のオペランドなので、そこからテンポラリを作成し、そのテンポラリに' 2'を代入する必要があります。代わりに、 'a'に' 2'が割り当てられます。(単純に '(a)= 2;を拒否する必要がありますが、いずれかの方法でコンパイルするが、実行時に異なる動作をするコードは面白いと思います)。 。 – hvd

答えて

1

The referenceこの質問が投稿された時点から更新されています。今では、左辺値昇格の右辺値は代入中に発生しないと言われています。したがって、これは明らかに古い参照のエラーです。

Borrow operators

&または& MUTの演算子は右辺値に適用されている場合は、一時的な値はIが、これはおそらく、同様refバインディングに適用することを意図している

を作成していますそれが明示的に言及されて見ていない。

Assignment

左側のオペランドは左辺値でなければなりません:コンパイラエラーで右辺値の結果を使用してではなく、一時的にそれを推進しています。

関連する問題