rust 在trait实现中,感叹号意味着什么?

gv8xihay  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(340)

我在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节实现

ltskdhd1

ltskdhd11#

这是Send特性的负面特性实现,如RFC 19中所述。
作为总结:Send trait是一个自动trait,这意味着它会自动为所有只包含其他Send类型的类型实现:

unsafe auto trait Send {}

Send也是一个 unsafe trait,这意味着它的实现是不安全的,但这与问题无关。)
auto trait不能定义任何方法,这也使它成为一个 marker trait。(定义auto trait的语法目前只在标准库或夜间编译器中可用,但它们的语义是稳定的。)
要退出Send的自动实现,你必须编写一个显式的否定特性实现:

impl !Send for MyType {}

这意味着即使MyType只包含其他Send类型,MyType本身也不会自动实现Send
另请参阅另一个问题的答案:What is an auto trait in Rust?

camsedfj

camsedfj2#

这是一个负面的特性impl,所以你可以把它理解为选择退出Send特性。

h7appiyu

h7appiyu3#

来自关于 * 汽车特质 * 的参考:
Auto trait也可以有负的实现,在标准库文档中显示为impl !AutoTrait for T,它覆盖了自动实现。例如*mut T有一个Send的负实现,所以*mut T不是Send,即使T是。

相关问题