gpt4 book ai didi

rust - 为什么 Rust 不允许在一种类型上复制和删除特征?

转载 作者:行者123 更新时间:2023-11-29 07:42:37 25 4
gpt4 key购买 nike

来自 the book :

Rust won’t let us annotate a type with the Copy trait if the type, or any of its parts, has implemented the Drop trait. If the type needs something special to happen when the value goes out of scope and we add the Copy annotation to that type, we’ll get a compile time error.

为什么设计决定不允许在同一类型上使用 CopyDrop

最佳答案

  • Drop 特性用于 RAII上下文,通常是在对象被销毁时需要释放/关闭某些资源时。
  • 另一方面,Copy 类型是一种普通类型,只能使用 memcpy 进行复制。

通过这两个描述,可以更清楚地看出它们是互斥的:memcpy 非平凡数据没有意义:如果我们复制数据并删除其中一份副本会怎样?另一个副本的内部资源将不再可靠。

事实上,Copy 甚至不是一个“真正的”特征,因为它没有定义任何函数。它是一个特殊的标记,它告诉编译器:“你可以用一个简单的字节副本来复制自己”。所以你不能提供 Copy 的自定义实现,因为根本没有实现。但是,您可以将类型标记为可复制:

impl Copy for Foo {}

或者更好,使用派生:

#[derive(Clone, Copy)]
struct Foo { /* ... */ }

仅当所有字段都实现Copy 时才会构建。否则,编译器会拒绝编译,因为这是不安全的。


为了举例,我们假设 File 结构实现了 Copy。当然,这不是,这个例子是错误的,无法编译:

fn drop_copy_type<T>(T x)
where
T: Copy + Drop,
{
// The inner file descriptor is closed there:
std::mem::drop(x);
}

fn main() {
let mut file = File::open("foo.txt").unwrap();
drop_copy_type(file);
let mut contents = String::new();

// Oops, this is unsafe!
// We try to read an already closed file descriptor:
file.read_to_string(&mut contents).unwrap();
}

关于rust - 为什么 Rust 不允许在一种类型上复制和删除特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51704063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com