这个问题在这里已有答案:
以下代码:
use std::rc::Rc;
fn main() {
let s = Rc::new(String::from("Hello"));
let o: &String = *s;
}
给我这个错误:
= note: expected type `&std::string::String`
found type `std::string::String`
我期望 *s
会给出某种参考,因为 deref
签名是 fn deref(&self) -> &T
.
令我困惑的一件事是,如果我将 let o
行更改为:
let o: String = *s;
我现在得到 cannot move out of borrowed content
的错误 .
所以我有两个相关的问题
-
为什么
*s
对于Rc值不返回引用? -
我理解如何不能移动引用,
*s
如何借用,而不是引用?我以为这些话意味着同样的事情?
1 回答
*s
未扩展为s.deref()
,它扩展为*(s.deref())
. 那是因为*
运算符的主要功能是取消引用指针 . 直观地说,你会期望*s
不返回指针(除非s
是指向指针的指针),无论s
是普通指针还是智能指针 . 这种扩张保留了直觉 .