rust-quiz:030-clone-pointers.rs
题目
use std::rc::Rc;
struct A;
fn p<X>(x: X) {
match std::mem::size_of::<X>() {
0 => print!("0"),
_ => print!("1"),
}
}
fn main() {
let a = &A;
p(a);
p(a.clone());
let b = &();
p(b);
p(b.clone());
let c = Rc::new(());
p(Rc::clone(&c));
p(c.clone());
}
关键
zst
对于zst类型,是不占用实际内存的。方法查找
T->&T->&mut T
题解
p
不难看出来,对于zst打印0,其他类型打印1。a
首先,A是zst,但是&A属于引用,不是zst类型,打印1。a.clone(),A本身没有实现Clone,因此方法查找时就会找到&A。
此时的&A作为&T#[stable(feature = "rust1", since = "1.0.0")] impl<T: ?Sized> Clone for &T { #[inline] #[rustc_diagnostic_item = "noop_method_clone"] fn clone(&self) -> Self { *self } }已经实现了
clone,类型不变,还是&A,打印1b
同样的,()是zst,但是&()有大小,打印1。
因为()实现了Clone,返回的当然是(),因此().clone()打印0cRc作为对象,本身肯定不是zst,打印1。
同时rc的clone只是增加了引用计数,还是rc,打印1
答案
111011
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: