什么允许函数在返回参数时隐式取消引用它?

时间:2017-03-27 00:47:50

标签: reference rust

在阅读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很熟悉,但我的印象是只使用函数参数,而不是返回值

1 个答案:

答案 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(以及它所源自的非常相关的线程),看起来这个 只是一个类型归属问题。现在看来,类型归属是在没有强制的情况下实现的,但几乎每个人都认为不应该是这种情况(事实上,类型归属的一个很好的用例就是暗示强制适用的编译器。)