Э
let arr = [0, 1, 2, 3];
let link: &[i32; 4] = &arr;
let sub: &[i32; 2] = unsafe { &*(link as *const [i32; 4]).cast::<[i32; 2]>() };
unsafe fn to_lesser<'a, T: Sized, U: Sized>(reference: &'a T) -> &'a U {
&*(reference as *const T as *const U)
}
Size: a a a
Э
let arr = [0, 1, 2, 3];
let link: &[i32; 4] = &arr;
let sub: &[i32; 2] = unsafe { &*(link as *const [i32; 4]).cast::<[i32; 2]>() };
Э
Э
Э
.len() == 0
в &[T; 0]. Но это какое-то извращение.M
struct B
, у него есть функция next(&mut self) -> &A
, которая возвращает ссылку на некоторый объект, срок жизни которой сохраняется вплоть до повторного вызова функции next()
(ну и дропа self
, естественно), как это лучше всего описать средствами языка?p
p
MB
M
MB
p
MB
MS
impl<'a> Iterator for &'a B {
type Item = &'a A;
}
p
p
M
M
В
slice: &[T]
в &[T; N]
нужно чтобы было верно slice.len() >= N
, или всё же slice.len() == N
?unsafe fn to_lesser<'a, T: Sized, U: Sized>(reference: &'a T) -> &'a U {Можно просто написать
&*(reference as *const T as *const U)
}
unsafe fn ref_transmute<T, U>(reference: &T) -> &U {
mem::transmute::<&T, &U>(reference)
}
BD