创建一个大小为 0 的数组会消耗价值,忘记它

Fil*_*ues 18 rust

我偶然发现了这个问题,在阅读了 ramslök 对已接受答案的评论后,我尝试了一个不是Copy.

令我惊讶的是它编译成功,但它的析构函数从未运行,有效地忘记了值,就好像std::mem::forget被调用一样。这是一个代码示例(Playground):

#[derive(PartialEq, Debug)]
struct A;

impl Drop for A {
    fn drop(&mut self) {
        println!("Dropping A");
    }
}

fn main() {
    let vec: Vec<A> = vec![];
    let a = A;
    assert_eq!(vec, [a; 0]);
}
Run Code Online (Sandbox Code Playgroud)

如果我们尝试在a之后使用assert_eq,它会抱怨该值已移动到数组中。

通过 已经可以忘记值std::mem::forget,并且它不会导致 UB,但仍然感觉很奇怪,如果没有编译器魔法是可能的。

我的问题是:这是一个错误,还是 Rust 的预期功能?

pro*_*ake 1

这是一个错误,[a; 0]旨在评估和删除a,如Rust 文档中关于数组类型的描述:

请注意 [expr; 0] 是允许的,并产生一个空数组。然而,这仍然会评估 expr,并立即删除结果值,因此请注意副作用。