我偶然发现了这个问题,在阅读了 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 的预期功能?
这是一个错误,[a; 0]旨在评估和删除a,如Rust 文档中关于数组类型的描述:
请注意 [expr; 0] 是允许的,并产生一个空数组。然而,这仍然会评估 expr,并立即删除结果值,因此请注意副作用。
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |