为什么`&mut&foo`有效,但`&mut a_ref_to_foo`无效?

col*_*ang 1 rust

在以下示例中,t1编译但t2不编译.

有什么特别的&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;
}
Run Code Online (Sandbox Code Playgroud)

操场

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

She*_*ter 5

&mut &foo
Run Code Online (Sandbox Code Playgroud)

这样做有两件事 - 它创建一个临时的类型值&Foo,然后创建另一个类型的临时值&mut &Foo.

let a_ref_to_foo = &foo;
&mut a_ref_to_foo
Run Code Online (Sandbox Code Playgroud)

这也创造了一个临时的类型&mut &Foo,而是别的东西可观察通过变量绑定a_ref_to_foo,另一个临时.

问题与此示例相同:

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

// Doesn't work
let s = String::new();
s.clear();
Run Code Online (Sandbox Code Playgroud)

当您拥有临时值时,您拥有它的所有权,包括将其视为可变.一旦将其分配给绑定,绑定就具有所有权,您必须指出允许其变异.