【发布时间】:2018-06-29 06:20:10
【问题描述】:
考虑以下代码:
pub trait Trait {
type Type;
const CONST: Self::Type;
}
impl<T> Trait for T {
type Type = u8;
const CONST: u8 = 42;
}
我(不正确?)对 Rust 的理解是这段代码应该可以工作,并且所有 Sized 类型现在都应该实现 Trait 并具有关联的类型 (Type = u8) 和 const (CONST = 42)。未调整大小的类型不应实现此特征,因为 impl<T> 隐式假定 T 为 Sized。
但是,当我尝试compile the code 时,我收到错误消息:
error[E0277]: the size for value values of type `T` cannot be known at compilation time
--> src/main.rs:8:3
|
8 | const CONST: u8 = 42;
| ^^^^^^^^^^^^^^^^^^^^^ 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/second-edition/ch19-04-advanced-types.html#dynamically-sized-types--sized>
= help: consider adding a `where T: std::marker::Sized` bound
= note: required because of the requirements on the impl of `Trait` for `T`
我的问题:
- 为什么Rust 认为
T不是Sized? Explicitly statingT: Sizeddoesn't help。 - 让我们假设
T不是Sized。为什么 Rust 会关心T的大小是否在这里?据我所知,没有什么取决于它(关联的类型和 const 与T无关)。将代码更改为T: ?Sized有效,因此很明显T未调整大小实际上并没有问题。
【问题讨论】:
-
这似乎是一个错误。有一个open issue。
-
您的意思是写
impl<T: Sized> Trait for T? (这并不能解决问题,但更符合您的问题描述) -
@Tim
T: Sized是多余的:All type parameters have an implicit bound ofSized.。 -
@kazemakase:谢谢!如果您将其发布为答案,我会接受。
-
@Cornstalks “这是一个错误”很难给出一个好的答案......但显然它是唯一的一个:(
标签: rust