今天在啃futures
这个crate,发现这样一段针对标准Future
扩展的源码:
impl<T: ?Sized> FutureExt for T where T: Future {}
因为在很多crate里面也见到过类似T: ?Sized
的情况,想问下在这里的?
操作符代表啥意思?
为啥不能用下面这种方式呢?
impl<T> FutureExt for T where T: Future + Sized {}
而且看api文档,似乎只有Sized
这个trait会用到这种特殊语法,但std文档中的解释并不能理解。有大佬能帮忙用比较浅显点的语言来解释下这样做的目的和用途么?多谢。
All type parameters have an implicit bound of Sized. The special syntax ?Sized can be used to remove this bound if it’s not appropriate.
1
共 3 条评论, 1 页
评论区
写评论学到了
多谢,了解了。 又细看了下std的例子,
?Sized
的确如所说,是用于不确定大小的类型。--
👇
7sDream: opt-out,目前应该只有 Sized 这个 Trait 能这么写,因为编译器对所有泛型参数都默认加上了这个 Sized Trait 的限制,所以提供了 ?Sized 来去掉这个限制。
至于为什么要加上,因为这个限制太普遍了,相比对于 99.9% 的 Case 让人手动加这个限制,不如让那 0.1% 的 Case 手动去掉来的简洁。
至于为什么 Sized Trait 这么普遍,那就是另一个话题了。简单来说就是编译器在生成函数调用的代码时需要知道栈的大小。
opt-out,目前应该只有 Sized 这个 Trait 能这么写,因为编译器对所有泛型参数都默认加上了这个 Sized Trait 的限制,所以提供了 ?Sized 来去掉这个限制。
至于为什么要加上,因为这个限制太普遍了,相比对于 99.9% 的 Case 让人手动加这个限制,不如让那 0.1% 的 Case 手动去掉来的简洁。
至于为什么 Sized Trait 这么普遍,那就是另一个话题了。简单来说就是编译器在生成函数调用的代码时需要知道栈的大小。