问题描述
我正在尝试使用 const 泛型从迭代器初始化数组数组。 以下代码作为示例:
pub fn foo<const R: usize,const C: usize>(iter: Iter<i32>) -> [[i32; C]; R] {
let mut res: [[MaybeUninit<i32>; C]; R] = unsafe { MaybeUninit::uninit().assume_init() };
let mut counter = 0;
res.iter_mut().flatten().zip(iter).for_each(|(r,l)| {
*r = MaybeUninit::new(*l);
counter += 1;
});
assert_eq!(counter,R * C);
unsafe { transmute::<_,[[i32; C]; R]>(res) }
}
但是,我收到错误:
error[E0512]: cannot transmute between types of different sizes,or dependently-sized types
--> src\main.rs:14:14
|
14 | unsafe { transmute::<_,[[i32; C]; R]>(res) }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: source type: `[[MaybeUninit<i32>; C]; R]` (this type does not have a fixed size)
= note: target type: `[[i32; C]; R]` (this type does not have a fixed size)
这两种类型显然都有固定的大小,所以我不明白这个错误......
如果我在程序中使用带有特定值的代码,它会起作用:
let iter = (0..4);
let res = {
let mut res: [[MaybeUninit<i32>; 2]; 2] = unsafe { MaybeUninit::uninit().assume_init() };
res.iter_mut().flatten().zip(iter).for_each(|(r,l)| {
*r = MaybeUninit::new(l);
});
unsafe { transmute::<_,[[i32; 2]; 2]>(res) }
};
println!("{:?}",res); //[[0,1],[2,3]]
这是 const 泛型的一些错误还是我做错了什么??
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)