【问题标题】:Anonymous slice lifetime [duplicate]匿名切片生命周期[重复]
【发布时间】:2020-10-16 20:01:34
【问题描述】:

考虑以下代码:

fn fun() {
    let mut vec = vec![];
    {
        let x: &[u8] = &[1, 2];
        vec.push(x); // why is the compiler happy?

        let y = [3, 4];
        let z: &[u8] = &y;
        vec.push(z); // ok compiler is not happy 
    }

    println!("{:?}", vec); // after commenting this line the compiler is happy again 
}

我理解为什么编译器会抱怨"borrowed value does not live long enough"y,但为什么它对x 很满意? x 是对没有名称的切片的引用——这个匿名切片何时被删除,它的生命周期是多少?

在注释完println 之后,一切都会编译,我猜这是因为编译器知道vec 没有在任何地方使用,所以它不在乎。

【问题讨论】:

  • vec 的预期类型是什么?我相信编译器认为它Vec<& 'static [u8; 2]>。尝试显式设置其类型。

标签: rust


【解决方案1】:

x 的情况下,编译器认为&[1,2] 借用了一个可以写成常量的表达式,所以它将constant promotion 改为&'static [u8; 2]

将值表达式提升到'static 槽的情况发生在表达式可以写入常量、借用并取消引用最初写入表达式的借用处,而不会更改运行时行为。也就是说,提升的表达式可以在编译时进行评估,并且结果值不包含内部可变性或析构函数(这些属性是根据可能的值确定的,例如 &None 始终具有 &'static Option<_> 类型,因为它不包含任何不允许的内容)。

z的表达式,即&y,不能写成常量,因为它借用了变量y,所以同样不适用于z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多