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

时间:2015-07-09 22:42:04

标签: rust

在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'的所有权转移相冲突。

2 个答案:

答案 0 :(得分:1)

这种事情在语言层面没有明确定义,但显然编译器必须做某事

答案 1 :(得分:1)

我建议你为你的结构派生CloneCopy,之后价值不会移动,但它会被复制,这样可以解决你的问题(价值不会因为结构很小,所以也很有效。

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

<强>更新

如果您不想派生Copy,您可以先通过复制索引轻松解决此问题,然后再执行以下任务:

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

这显然会强制评估的顺序。