我在std::rc::Rc
的库参考中找到了这个特征实现
impl<T> !Send for Rc<T>
where
T: ?Sized,
Send
前面的惊叹号是什么意思?
我查阅了The Rust Programming Language ¹ book和The Rust Reference ²,但没有找到解释。请在您的答案中给予参考。
¹尤其是[第3.19 Traits节
²和第5.1节特性和第5.1节实现
我在std::rc::Rc
的库参考中找到了这个特征实现
impl<T> !Send for Rc<T>
where
T: ?Sized,
Send
前面的惊叹号是什么意思?
我查阅了The Rust Programming Language ¹ book和The Rust Reference ²,但没有找到解释。请在您的答案中给予参考。
¹尤其是[第3.19 Traits节
²和第5.1节特性和第5.1节实现
3条答案
按热度按时间ltskdhd11#
这是
Send
特性的负面特性实现,如RFC 19中所述。作为总结:
Send
trait是一个自动trait,这意味着它会自动为所有只包含其他Send
类型的类型实现:(
Send
也是一个 unsafe trait,这意味着它的实现是不安全的,但这与问题无关。)auto
trait不能定义任何方法,这也使它成为一个 marker trait。(定义auto trait的语法目前只在标准库或夜间编译器中可用,但它们的语义是稳定的。)要退出
Send
的自动实现,你必须编写一个显式的否定特性实现:这意味着即使
MyType
只包含其他Send
类型,MyType
本身也不会自动实现Send
。另请参阅另一个问题的答案:What is an auto trait in Rust?
camsedfj2#
这是一个负面的特性impl,所以你可以把它理解为选择退出
Send
特性。h7appiyu3#
来自关于 * 汽车特质 * 的参考:
Auto trait也可以有负的实现,在标准库文档中显示为
impl !AutoTrait for T
,它覆盖了自动实现。例如*mut T
有一个Send
的负实现,所以*mut T
不是Send
,即使T
是。