Rust 临时声明周期扩展


fn main() {
let foo = &String::new();
foo;
// compile error
let bar = String::new().as_bytes();
bar;
}

zhihu:
能编译通过的例子中有两个value,一个是String,一个是&String,后者是个 ordinary pointer,后者被赋值给了一个变量,前者没有赋值给任何变量,因为前者一直被后者指向,所以在后者的生存期内前者一直存活,所以前者在当前语句结束后、在当前语句块结束前一直存活。再看不能编译通过的例子,也有两个value,一个是String,一个是&[u8]。后者是个two-word pointer,指向前者管理的堆内存地址而不是指向前者本身。所以前者既没有被赋给一个变量(绑定一个alias)也没有被其他指针指向,所以rust认为它的生存期该结束了,决定销毁这个value,同时决定free掉这个value所管理的堆数组,这样以来第二个value 就变成 dangling pointer了。所以编译无法通过。下面返回&'static [u8]这个就更好理解了,因为那个那个数组字面量的内容和长度已经在编译时刻就确定了,指定了’static,编译完成的时候这个数组是放在静态数据区的,而不是运行时刻在栈上构造的。返回一个指向静态数据区的指针当然没问题。