首页 文章

Rc :: deref是否返回引用? [重复]

提问于
浏览
2

这个问题在这里已有答案:

以下代码:

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 回答

  • 3

    *s 未扩展为 s.deref() ,它扩展为 *(s.deref()) . 那是因为 * 运算符的主要功能是取消引用指针 . 直观地说,你会期望 *s 不返回指针(除非 s 是指向指针的指针),无论 s 是普通指针还是智能指针 . 这种扩张保留了直觉 .

相关问题