2017-06-01 38 views
1

在以下示例中,編譯了t1,但t2沒有編譯。爲什麼`&mut&foo`有效,但'&mut a_ref_to_foo`無效?

&mut &stream有什麼特別的嗎?我不認爲Deref

use std::net::TcpStream; 

fn t1() { 
    let stream = TcpStream::connect("127.0.0.1").unwrap(); 
    let a = &mut &stream; 
} 

fn t2(stream: &TcpStream) { 
    let a = &mut stream; 
} 

Playground

9 | fn t2(stream: &TcpStream) { 
    |  ------ use `mut stream` here to make mutable 
10 |  let a = &mut stream; 
    |     ^^^^^^ cannot borrow mutably 

回答

5
&mut &foo 

這做了兩兩件事 - 它創造&Foo類型的臨時值,然後創建另一個臨時&mut &Foo類型。

let a_ref_to_foo = &foo; 
&mut a_ref_to_foo 

這也將創建一個臨時&mut &Foo型的,而是一些通過變量綁定a_ref_to_foo是可觀察的,另一個臨時。

的問題是相同的,因爲這例如:

// Works 
String::new().clear(); 

// Doesn't work 
let s = String::new(); 
s.clear(); 

當你有一個臨時值,必須在它的所有權,其包括治療它作爲可變的。一旦它被分配到一個綁定,綁定擁有所有權,您必須指出它允許被突變或不被允許。

+0

'let a_ref_to_foo = &foo;'應爲'let mut a_ref_to_foo = &foo;'。建議的編輯被拒絕。 – red75prime

+0

@ red75prime no。第二個例子旨在反映OP案例。添加一個'mut'將會使代碼編譯,否定整個例子。據推測,OP已經知道如何解決這個問題(編譯器的錯誤信息同樣多)並詢問有什麼不同。 – Shepmaster

+0

啊,我在題目中錯過了'&mut a_ref_to_foo'。問題中的代碼沒有包含它,所以我決定引入它來解釋臨時值是如何工作的。我很抱歉誤會。 – red75prime

相關問題