gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:06:16 24 4
gpt4 key购买 nike

阅读时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 ,但我的印象是它只对函数参数起作用,而不是返回值

最佳答案

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

关于reference - 什么允许函数在返回参数时隐式取消引用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com