显然,在99%的情况下,它是否有效并不重要,只是为了帮助像我这样愚蠢而焦虑的开发人员晚上睡个好觉:
假设您的代码调用了一个复杂的库函数,该函数返回一个可变引用,然后您希望返回该引用.此引用也恰好是对实现Clone的类型的引用.因此,为了避免过多的重构,您可以这样做:
fn common_behavior(specs: Specs) -> ClonableThing {
let mut intermediate_thing = IntermediateThing::new(specs);
let clonable_thing: &mut ClonableThing = intermediate_thing.create_mut_ref_to_thing();
// Will the clone here be reliably optimized out?
std::mem::replace(clonable_thing, clonable_thing.clone())
}
显然,当intermediate_thing
和其他所有内容超出范围时,clonable_thing.clone()
生成的替换值将立即被删除,但我们能指望克隆操作本身不会发生吗?这是假设intermediate_thing
是一个相当复杂的 struct 体,但克隆本身只是由#[derive(Clone)]
生成的.