gpt4 book ai didi

rust - 取消引用 Box 返回值而不是引用

转载 作者:行者123 更新时间:2023-11-29 07:51:56 25 4
gpt4 key购买 nike

我似乎无法弄清楚为什么:

let a = Box::new(5i32);
let _:() = *a;

告诉我第二行的分配类型是 i32 而不是 &i32 因为 Deref.deref() (我假设是在 *a 调用),返回 &T

此外,如果我自己调用 deref():

let _:() = <Box<i32> as Deref>::deref(&a);

我得到了预期的 &i32

最佳答案

取消引用不一定会产生(中间)值。考虑

let b = Box::new(1);
(*b).clone();

i32::clone() 方法使用 &self 参数调用,其中引用指向框内的值,而不是可能是临时值由 (*b) 产生。

性状 Deref是实现取消引用的一部分(就像 DerefMut )。

* 可以在盒子上额外做的事情没有相应的特征:将内部值移出并丢弃盒子;这通俗地称为 DerefMove,但此时仍然是编译器硬编码的 box 专业。

当编译器看到 (*a) 时,它必须推断是使用 DerefDerefMut 还是“DerefMove”;它是从表达式的使用方式推断出来的:例如,如果您对结果调用 &self 方法,则使用 Deref

已编辑:固有可复制类型(特征 Copy),使用 Deref 后跟复制而不是“DerefMove”;这不再局限于 Box,而是适用于所有智能指针。

关于rust - 取消引用 Box<T> 返回值而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653946/

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