请考虑以下代码:
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
;它在哪里移动?
答案 0 :(得分:2)
那么谁在这里拥有`not_copyable;它在哪里移动?
没有人。表达式foo.not_copyable
必须将值拉出结构,因为该值是表达式的结果。你不做任何有价值的东西都在这一点上;你问了价值,它给了你价值。
编译器可能可以在某些情况下优化它,但如果没有它,它将像你要求的那样移动值。
是的,foo;foo;
会做同样的事情:就像NotCopyable
不可复制一样,MyString
也不是。{/ p>