感叹号在特征实现中意味着什么?

What does the exclamation point mean in a trait implementation?

我在图书馆参考中找到 std::rc::Rc this trait implementation

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

Send前面的感叹号是什么意思?

我咨询了两个 The Rust Programming Language¹ book and The Rust Reference²,但没有找到解释。请在您的回答中给出参考。


¹ 尤其是[部分3.19 Traits
²和章节5.1 Traits and 5.1 Implementations

这是 negative trait impl,因此您可以将其解读为选择退出 Send 特征。

这是 RFC 19 中描述的 负面特征实施 Send 特征。

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

unsafe auto trait Send {}

Send 也是一个 不安全特征 ,这意味着实施起来不安全,但这与问题无关。)

一个auto特征可能不定义任何方法,这也使它成为一个标记特征。 (定义 auto traits 的语法目前仅在标准库或 nightly 编译器中可用,但它们的语义是稳定的。)

要选择退出 Send 的自动实现,您必须编写一个明确的负面特征实现:

impl !Send for MyType {}

这意味着即使MyType仅包含其他类型SendMyType本身也不会自动实现Send

另见另一个问题的答案: