什么时候被临时毁坏?

Mat*_* M. 16 rust

到目前为止,我认为在产生它的声明的评估结束时,临时性被破坏了.

但是,当使用临时初始化a的字段时,似乎存在异常struct.

PeterHall帮助提供了一个简单的代码示例,说明评论与他的答案的区别,我简化了一点:

struct Wrapper<'a> {
    cmd: &'a Cmd<'a>,
}

struct Cmd<'a> {
    args: &'a Option<String>,
}

impl <'a> Cmd<'a> {
    fn new(args: &'a Option<String>) -> Cmd<'a> {
        Cmd {
            args: args,
        }
    }
}

pub fn main() {
    // OK
    let cmd = Cmd {
        args: &None,
    };

    // OK
    let cmd = Wrapper {
        cmd: &Cmd {
            args: &None,
        }
    };

    // Lifetime error
    let cmd = Some(Cmd {
        args: &None,
    });

    // Lifetime error
    let cmd = Cmd::new(&None);
}
Run Code Online (Sandbox Code Playgroud)

那么,临时被破坏的确切规则是什么?

Tha*_*yne 1

让我们先看看第二个失败的行:

let cmd = Cmd::new(&None);
Run Code Online (Sandbox Code Playgroud)

&None创建一个具有单行生命周期的临时对象。Cmd::new返回Cmd具有相同生命周期的 a 。然后我们尝试将该临时值存储在变量中let

Rust参考文献指出

然而,当创建一个临时右值并将其分配给 let 声明时,该临时右值是使用封闭块的生命周期创建的......

它尝试增加Cmd临时变量的生命周期,但这取决于&None临时变量的生命周期,并且由于该临时变量实际上并未存储在 a 中let(关于临时变量持续到语句结束的规则的例外),它的生命周期小于 的生命周期,cmd并且您会得到生命周期错误。

直接结构语句有效,因为let生命周期适用于结构及其成员。

它不适用于Some(枚举)这一事实对我来说似乎是一个错误(或者至少是一个缺失的功能)。