【问题标题】:Is it true that for all types `T`, `U` if `T` is coerced to `U` then `&T` is coerced to `&U`?对于所有类型的`T`,`U`,如果`T`被强制为`U`,那么`&T`被强制为`&U`,是真的吗?
【发布时间】:2020-12-06 16:00:49
【问题描述】:

well documented 可以将 [T; n] 强制转换为 [T]。下面的代码也是well-formed

fn test(){
    let _a: &[i32] = &[1, 2, 3];
}

在这里,&[T; n] 被强制转换为 &[T]

对于所有类型TU,如果T 被强制转换为U,那么&T 是否被强制转换为&U

参考文献中没有记录(至少明确地)。

【问题讨论】:

标签: rust language-lawyer type-coercion


【解决方案1】:

不,因为再添加一层& 会导致它失败:

fn oops() {
    let a: &[i32; 3] = &[1, 2, 3];
    let _b: &&[i32] = &a;
}
error[E0308]: mismatched types
 --> src/lib.rs:8:23
  |
8 |     let _b: &&[i32] = &a;
  |             -------   ^^ expected slice `[i32]`, found array `[i32; 3]`
  |             |
  |             expected due to this
  |
  = note: expected reference `&&[i32]`
             found reference `&&[i32; 3]`

此外,[T; n] 强制 [T]&[T; n] 强制 &[T] 不同。您链接的文档描述了与 unsized coercions 相关的两个特征:UnsizeCoerceUnsized[T; n] 实现Unsize<[T]>因此 &[T; n] 实现CoerceUnsized<&[T]>;这本质上是一回事,您的代码有效地演示了两者。不可能编写一个函数将[T; n] 强制转换为[T] 不使用引用(或某种指针),因为取消大小强制只发生在某种指针后面。

【讨论】:

  • 从本质上讲,一个未调整大小的强制转换总是将某种 pointer 转换为 fat pointer。该文档的措辞确实有些混乱,可以改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多