这个问题比较奇怪,在C++中sizeof(T)
是直接可以当作常量,作为数组长度的,但是在Rust中却报generic parameters may not be used in const operations
。
解决方案来自Github上的一个issue
#![feature(generic_const_exprs)]
unsafe fn foo<T>(item: &T)
where [(); size_of::<T>()]:
{
let raw: [u8; size_of::<T>()] = unsafe { transmute_copy(item) };
// ...
}
注意:
where
必须有,否则编译器会报unconstrained generic constant
。- 不能用
transmute
,因为编译器不知道[u8;size_of::<T>()]
大小固定。
不过一般情况下,这种需求也可以用std::slice::from_raw_parts(item as *const _ as *const u8, size_of::<T>())
来代替,这样可以避免一次复制,而且不需要features。