我正在使用通过 FFI 调用的代码初始化一个数组,因此我使用一个数组 if
MaybeUninit
来表示该数据。它看起来像这样:
use std::mem::MaybeUninit;
#[allow(unused)]
fn init_with_ffi<T>(data: &mut [T]) {
todo!();
}
fn get_array<T, const D: usize>() -> [T; D] {
let mut my_array: [MaybeUninit<T>; D] = unsafe {
MaybeUninit::uninit().assume_init()
};
init_with_ffi(&mut my_array[..]);
unsafe {
*(&mut my_array as *mut [MaybeUninit<T>; D] as *mut [T; D])
}
}
这类似于 MaybeUninit 的文档 中提供的示例之一,但它是通用的。我必须在这里使用原始指针,因为
std::mem::transmute
不适用于通用大小的数组。
但是,我收到以下错误:
error[E0508]: cannot move out of type `[T; D]`, a non-copy array
--> src/main.rs:14:9
|
14 | *(&mut my_array as *mut [MaybeUninit<T>; D] as *mut [T; D])
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| cannot move out of here
| move occurs because value has type `[T; D]`, which does not implement the `Copy` trait
这个错误消息对我来说毫无意义。如果我尝试复制非复制数组或者尝试将其中一个值移出非复制数组,那么这是有意义的。但我正在尝试移动整个阵列,我的印象一直是这应该是可能的,不是吗?
您的代码实际上与:
相同let ptr: *mut [T;D] = &mut my_array as *mut [MaybeUninit<T>; D] as *mut [T; D];
*ptr
它将尝试复制而不是移动指针中的数据。
如 MaybeUninit
文档中的
逐个元素初始化数组部分所示,您需要使用
std::mem::transmute
来移动值。