gpt4 book ai didi

rust - 在分析表达式中的所有权时是否考虑了评估顺序?

转载 作者:行者123 更新时间:2023-11-29 07:55:26 24 4
gpt4 key购买 nike

在 Rust 1.0 中,编译器在分析表达式中的所有权时是否考虑求值顺序?例如:

struct Foo { val:usize }

fn main() {
let mut v:Vec<Foo> = Vec::with_capacity(1);
v.push(Foo{val:0});

let f = Foo{val:0};
v[f.val] = f; // error: use of moved value
}

编译失败,因为数组中的索引是 f.val,而 f 正在被移动到数组中。我不明白为什么使用 f.val 作为 LHS 上的索引会与 RHS 上“f”的所有权转移发生冲突。

最佳答案

我建议你为你的结构派生 CloneCopy ,之后值不会移动,但它会被复制,这解决了你的问题(该值将不再移动)并且也有效,因为该结构非常小。

#[derive(Clone, Copy)]
struct Foo { val: usize }

更新

如果您不想派生Copy,您可以通过先复制索引并仅在之后进行赋值来轻松解决此问题:

let index = f.val; // usize is copyable, so no moves here
v[index] = f;

这显然强制了评估顺序。

关于rust - 在分析表达式中的所有权时是否考虑了评估顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329532/

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