【发布时间】:2020-04-10 19:50:57
【问题描述】:
我在理解这段代码的问题时遇到了一些麻烦:
fn doesnt_compile<T>() {
println!("{}", std::mem::size_of::<[T; std::mem::size_of::<T>()]>());
}
fn main() {
doesnt_compile::<i32>();
}
当在操场上(或在我的机器上)运行时,编译器似乎忽略了 T 的隐式 trait bound 'Sized'。
这是错误:
error[E0277]: the size for values of type `T` cannot be known at compilation time
--> src/main.rs:2:64
|
2 | println!("{}", std::mem::size_of::<[T; std::mem::size_of::<T>()]>());
| ^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `T`
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= help: consider adding a `where T: std::marker::Sized` bound
我盯着它看了一会儿,试着用不同的方式重写它,但我不明白为什么它不应该编译。我发现它特别令人困惑,因为以下代码可以正常工作:
fn compiles<T>() {
println!("{}", std::mem::size_of::<T>());
}
fn main() {
compiles::<i32>();
}
我有什么遗漏吗?是编译器的bug吗?
【问题讨论】:
-
这在我看来像是一个编译器错误。我还不确定代码是否应该编译,但错误消息看起来肯定是错误的。
-
有趣;我尝试将
size_of::<T>()提升为const并遇到另一个错误-const项目不能使用外部函数中的通用参数,这对fn/type项目有意义,但绝对不是对于const。 -
@MatthieuM。这实际上是预期的行为,尽管可以改进错误消息。
-
附带说明,绑定在
T上的Sized是多余的。所有类型参数都有一个隐含的Sized界限。如果你想允许 unsized 类型,你需要用T: ?Sized覆盖那个隐式绑定。 -
@SvenMarnach 是的,我把它放在那里是因为编译器错误指出 T 不满足 Sized。我将改写问题并更正代码。
标签: templates generics rust compile-time