我在图书馆的参考资料中找到了std::rc::Rctrait implementation

impl<T> !Send for Rc<T> 
where
    T: ?Sized, 

What does the exclamation point in front of 100 mean?

我查阅了The Rust Programming Language²的书和The Rust Reference²的书,但没有找到解释.请在你的回答中提供一个参考.


¹ especially the [section 3.19 Traits
² and sections 5.1 Traits and 5.1 Implementations

推荐答案

这是一个negative trait implementation代表RFC 19中描述的Send特征.

总结:Send trait是auto trait,这意味着它会自动为所有只包含其他Send个类型的类型实现:

unsafe auto trait Send {}

(Send也是unsafe trait,这意味着实施起来不安全,但这与问题无关.)

auto个特征可能无法定义任何方法,这也使其成为marker trait个特征.(定义自动特征的语法目前仅在标准库或夜间编译器中可用,但它们的语义是稳定的.)

要退出Send的自动实现,您必须编写一个明确的消极trait 实现:

impl !Send for MyType {}

这意味着,即使MyType只包含Send的其他类型,MyType本身也不会自动实现Send.

另见另一个问题的答案:What is an auto trait in Rust?

Rust相关问答推荐

使用InlineTables序列化toml ArrayOfTables

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

值为可变对象的不可变HashMap

原始数组数据类型的默认trait实现

一种随机局部搜索算法的基准(分数)

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

了解Rust';s特征对象和不同函数签名中的生存期注释

为什么 GAT、生命周期和异步的这种组合需要 `T: 'static`?

如何从trait方法返回std :: iter :: Map?

Rust 程序中的内存泄漏

使用在功能标志后面导入的类型,即使未启用功能标志

Rust 中的生命周期:borrow 的 mut 数据

如何解析 Rust 中的 yaml 条件字段?

当我在 struct 中存储异步函数时,为什么它需要生命周期

是否有适当的方法在参考 1D 中转换 2D 数组

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器