谁拥有一个没有让绑定的价值?

时间:2015-07-18 10:20:27

标签: rust

请考虑以下代码:

struct MyStruct {
    not_copyable: NotCopyable
}

struct NotCopyable;

fn main() {
    let foo = MyStruct { not_copyable: NotCopyable };
    foo.not_copyable;
    foo.not_copyable;

    // just found out the simpler "foo; foo;" will create the same problem
}

无法使用

进行编译
src/main.rs:17:5: 17:21 error: use of moved value: `foo.not_copyable` [E0382]
src/main.rs:17     foo.not_copyable;
                   ^~~~~~~~~~~~~~~~
src/main.rs:16:5: 16:21 note: `foo.not_copyable` moved here because it has type `NotCopyable`, which is non-copyable
src/main.rs:16     foo.not_copyable;
                   ^~~~~~~~~~~~~~~~
error: aborting due to previous error

虽然我仍然不熟悉所有权系统,但我想我明白为什么你不能创建两个let绑定到foo.not_copyable。但在这种情况下,没有约束力。那么谁在这里拥有not_copyable;它在哪里移动?

1 个答案:

答案 0 :(得分:2)

  

那么谁在这里拥有`not_copyable;它在哪里移动?

没有人。表达式foo.not_copyable必须将值拉出结构,因为该值是表达式的结果。你不任何有价值的东西都在这一点上;你问了价值,它给了你价值。

编译器可能可以在某些情况下优化它,但如果没有它,它将像你要求的那样移动值。

是的,foo;foo;会做同样的事情:就像NotCopyable不可复制一样,MyString也不是。{/ p>