【发布时间】:2016-01-14 08:18:47
【问题描述】:
一个简单的例子:
struct A;
fn main() {
test(2);
test(1);
}
fn test(i: i32) {
println!("test");
let a = A;
if i == 2 {
us(a);
}
println!("end");
}
impl Drop for A {
fn drop(&mut self) {
println!("drop");
}
}
#[allow(unused_variables)]
fn us(a: A){
println!("use");
}
当我运行它时,输出是:
test
use
drop
end
test
end
drop
我理解在test(2) 的情况下,a 移动到us(a),所以它的输出是“test-use-drop-end”。
但是,在test(1) 中,输出是“test-end-drop”,这意味着编译器知道a 没有被移动。
如果调用us(a),则a不需要在test(i)中删除,它会在us(a)中删除;如果没有调用us(a),则必须在println!("end") 之后删除a。
既然编译器不可能知道us(a)是否被调用,那么编译器如何知道a.drop()在println!("end")之后是否应该被调用?
【问题讨论】:
标签: rust