我在玩零大小类型(zst)时遇到了一个有趣的例子.对空数组的引用将转化为具有任何生存期的引用:
fn mold_slice<'a, T>(_: &'a T) -> &'a [T] {
&[]
}
我想了一下这是怎么可能的,因为这里的"值"基本上存在于函数的堆栈框架上,但签名promise 返回一个对具有更长生存期的值的引用('a
包含函数调用).我得出的结论是,这是因为空数组[]
是一个基本上只静态存在的ZST.编译器可以"伪造"引用引用的值.
所以我try 了这个:
fn mold_unit<'a, T>(_: &'a T) -> &'a () {
&()
}
然后编译器抱怨:
error: borrowed value does not live long enough
--> <anon>:7:6
|
7 | &()
| ^^ temporary value created here
8 | }
| - temporary value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the block at 6:40...
--> <anon>:6:41
|
6 | fn mold_unit<'a, T>(_: &'a T) -> &'a () {
| ^
它不适用于单元()
类型,也不适用于空 struct :
struct Empty;
// fails to compile as well
fn mold_struct<'a, T>(_: &'a T) -> &'a Empty {
&Empty
}
不知何故,单元类型和空 struct 的处理方式与空数组不同.除了作为ZST,这些值之间还有其他区别吗?这些差异(&[]
适合任何生命周期 ,&()
&Empty
不适合)与ZST完全无关吗?