据我所知,&[T]类型是一个“fat”指针(内存地址和大小),而不是切片本身,而[T]是被引用的实际切片。但是为什么他们不让[T]在下面的上下文中成为一个语法错误呢?
let y: [i32; 6] = [1, 2, 3, 4, 5, 6];
// let z: [i32] = y[..]; // error: the size for values of type `[i32]` cannot be known at compilation time
let z: &[i32] = &y[..]; // OK
// let v: str = "Hello World"; // the size for values of type `str` cannot be known at compilation time从错误:[i32] cannot be known at compilation,这仅仅是一个错误,让我的用户,理解为什么这个语法是不可能的,还是因为我没有正确使用这个语法,而且它在某些上下文中是有效的?
编辑:固定排版
发布于 2021-04-16 13:04:46
因为可以在某些上下文中使用不大小的类型,如str、[T]和dyn MyTrait。
目前最常见的是仿制药。例如,您可以拥有一个Box<[T]>或Box<str>、Arc<[T]>或任何与?Sized绑定的泛型。
还有一些正在开发中的特性使用这样的非大小类型:
发布于 2021-04-16 13:20:05
但是为什么他们不让T在下面的上下文中成为一个语法错误呢?
因为语法没有任何理由无效吗?
虽然DSTs很难使用,并不是所有地方都有意义,但在某些情况下,它们是完全合法的。
struct Foo {
a: usize,
b: [i32]
}https://stackoverflow.com/questions/67125730
复制相似问题