无法移出类型`[T; D]`,非复制数组

问题描述 投票:0回答:1

我正在使用通过 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

这个错误消息对我来说毫无意义。如果我尝试复制非复制数组或者尝试将其中一个值移出非复制数组,那么这是有意义的。但我正在尝试移动整个阵列,我的印象一直是这应该是可能的,不是吗?

arrays rust move unsafe maybeuninit
1个回答
0
投票

您的代码实际上与:

相同
let ptr: *mut [T;D] = &mut my_array as *mut [MaybeUninit<T>; D] as *mut [T; D];
*ptr

它将尝试复制而不是移动指针中的数据。

MaybeUninit 文档中的

逐个元素初始化数组
部分所示,您需要使用
std::mem::transmute
来移动值。

© www.soinside.com 2019 - 2024. All rights reserved.