在阅读How can I reborrow a mutable reference without passing it to a function?时,OP的功能如下:
fn deref<'a, 'b: 'a, T>(t: &'a mut &'b mut T) -> &'a mut T {
*t
}
这对我有意义。但是,他们还指出,身体*
中的明确解除引用不是必需的:
fn deref<'a, 'b: 'a, T>(t: &'a mut &'b mut T) -> &'a mut T {
t
}
这编译,我不知道为什么。我对automatic dereferencing很熟悉,但我的印象是只使用函数参数,而不是返回值。
答案 0 :(得分:3)
阅读relevant docs,似乎Deref
转换总是按需要多次发生 - 无论何时需要。 Deref
提到的唯一非常时髦的附加技巧是它在self
个参数上也有效。
以下代码段都有效 - 这里的表达式绝对不限于参数或返回值。
// &&&&1 gets dereferenced to &i32 from &&&&i32
let x: &i32 = &&&&1;
let x: (&i32,) = (&&&&1,);
唯一存在的问题是,Deref
仅适用于&U
形式的类型,因此&1
之类的内容永远不会被强制转移到&i32
来自i32
,即使&&1
可以从&&i32
强制转换为&i32
。
作为旁注,我意识到类型归属有点特殊,但似乎Deref
没有进行转换。我不确定它是否符合设计要求,或者我是否只是误解了某些内容。以下无法工作。
#![feature(type_ascription)]
// ....
let x = &&1i32: &i32;
基于this comment(以及它所源自的非常相关的线程),看起来这个 只是一个类型归属问题。现在看来,类型归属是在没有强制的情况下实现的,但几乎每个人都认为不应该是这种情况(事实上,类型归属的一个很好的用例就是暗示强制适用的编译器。)