これまでは、それを生み出したステートメントの評価の終了時に一時的なものが破壊されたと仮定しました。一時的に破壊されるのはいつですか?
ただし、struct
のフィールドを一時的に初期化するときに例外が発生しているようです。
PeterHallは親切に私は
を簡素化しましたhis answerにコメント、簡単なcode sample illustrating the differenceを提供するには少し複雑:
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);
}
ので、一時的に破壊されたときのための正確な規則は何ですか?第一、第二、失敗ラインで
説明は分かりませんが、一貫性がないことは確かです。 – Boiethios
「ライフタイムチェックは関数境界で停止する」というアスペクトに関連しています。ワーキングケースは構造体イニシャライザを持っているため、コンパイラにとってより透過的ですが、失敗した場合は関数呼び出しです。 – Shepmaster
@Shepmaster:これは実際には、すべての借用がローカル変数のフィールドで独立して機能するが、関数呼び出しでは機能しないので、このようなものになる可能性があります。 –