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
のパターンがあるときはいつでも、そのパターンへの左の値バインディングは左辺のコンテキストです。この場合のプロモーションは次のようになります。
明らかに、宣伝は(複合)割り当てには対応していません。
十分におかしく、 '*&mut 27 = 28;'はコンパイルします。あなたの例では – mcarton
@mcartonのプロモーションは、代入演算子ではなく借用演算子のために発生します。しかし興味深いことに確かに^ _^ –
関連:ドキュメントは 'let mut a = 1; *&mut(a)= 2; assert_eq!(a、1); 'は渡すべきです:'(a) 'の' a'は '&mut'のオペランドではないので、rvalueに変換する必要があります。 '(a)'はrvalueで、これは '&mut'のオペランドなので、そこからテンポラリを作成し、そのテンポラリに' 2'を代入する必要があります。代わりに、 'a'に' 2'が割り当てられます。(単純に '(a)= 2;を拒否する必要がありますが、いずれかの方法でコンパイルするが、実行時に異なる動作をするコードは面白いと思います)。 。 – hvd