【发布时间】:2022-11-07 07:09:06
【问题描述】:
根据问题,假设我有以下代码:
struct Test {
x: i32
}
fn main() {
let test1 = Test { x: 32 }; // type inference by vscode: Test
let test2 = &test1 // type inference by vscode: &Test
let test3 = &test2 // type inference by vscode: &&Test
let explicit_ref: &Test = &test3; // This should give an error but works as I haven't implemented
//Deref trait.
}
我错过了什么还是我误解了自动取消引用和取消引用强制?
【问题讨论】:
-
是的,这里发生了 deref 强制,但这与您尚未实现
Deref的事实有何关系? -
你还没有为
Test实现Deref,但是对于任何&T仍然有一个毯子Deref<Target = T>impl。所以&&T可以强制转换为&T -
@cameron1024 从技术上讲,这不是使用
Derefimpl(相反 - 它对&T使用内置取消引用,它只需要泛型)。 -
@ChayimFriedman:嗯?它正是通过
<&T as Deref>::deref(&self) -> &T使用(传递)强制。 -
@eggyal这个impl存在,但它不是编译器使用的(除非在通用上下文中)。它本身是递归的——它指的是引用的内置取消引用。
标签: rust